gpt4 book ai didi

r - ggplot2 中的水平滑动条形图

转载 作者:行者123 更新时间:2023-12-04 11:29:34 25 4
gpt4 key购买 nike

我已经创建了我需要的图,但我想滑动条形图,使每个子图的中心中性类别均匀地跨越零 (x=0)。有任何想法吗?也许我在这里没有使用正确的几何构造?

library(ggplot2)
survey_data <- data.frame(gender=rep(c("Unreported","Female","Male"),7),
feel_job=c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7),
Freq=c(0, 0, 0, 1, 3, 5, 0, 4, 4, 0, 7, 15, 3, 28, 35, 3, 35, 80, 1, 52, 108))
p <- ggplot(survey_data, aes(gender)) +
geom_bar(aes(y = Freq, fill = factor(feel_job)), stat = "identity") +
coord_flip()
p

显然,这些类型的图在某些圈子中也被称为“发散堆叠条形图”。

最佳答案

我猜是因为因子 feel_job 有 7 个水平您希望 level = 4 在 y 轴上。来自 http://learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts/ 的示例,我认为可能有一种作弊方法。

关键似乎是不要依赖 ggplot 来做所有事情。相反,你必须创建你的统计数据,然后摆弄它们。我决定尝试使用 geom_rect()而不是 Vanilla geom_bar() ,这意味着我需要为 xmin, xmax, ymin 的每个栏提供值和 ymax .这个答案的其余部分将展示如何做到这一点。

# save the data we were given
a.survey.data <-survey_data

# going to plot this as rectangles
a.survey.data$xmin[a.survey.data$feel_job < 4] = -a.survey.data$Freq[a.survey.data$feel_job < 4]
a.survey.data$xmin[a.survey.data$feel_job == 4] = -a.survey.data$Freq[a.survey.data$feel_job == 4]/2
a.survey.data$xmin[a.survey.data$feel_job > 4] = 0

a.survey.data$xmax[a.survey.data$feel_job < 4] = 0
a.survey.data$xmax[a.survey.data$feel_job == 4] = a.survey.data$Freq[a.survey.data$feel_job == 4]/2
a.survey.data$xmax[a.survey.data$feel_job > 4] = a.survey.data$Freq[a.survey.data$feel_job > 4]

# assign values to ymin and ymax based on gender and
y.base <- NA
y.base[a.survey.data$gender == "Female"] = 1
y.base[a.survey.data$gender == "Male"] = 2
y.base[a.survey.data$gender == "Unreported"] = 3

a.survey.data$ymin <- y.base + (a.survey.data$feel_job-4)*0.1 - 0.05
a.survey.data$ymax <- y.base + (a.survey.data$feel_job-4)*0.1 + 0.05

# set the labels
a.survey.data$feel_job.cut <- factor(cut(a.survey.data$feel_job,
breaks = c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5),
labels = c("1",
"2",
"3",
"neutral",
"5",
"6",
"7"),
ordered = TRUE))

p2 <- ggplot(data = a.survey.data,
aes(xmax = xmax,
xmin = xmin,
ymax = ymax,
ymin = ymin)) +
geom_rect(aes(fill = feel_job.cut)) +
scale_y_continuous(limits = c(0.5,3.5),
breaks=c(1,2,3),
labels=c("Female","Male","Unreported"))
print(p2)

然后我们得到... enter image description here

关于r - ggplot2 中的水平滑动条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com