[英]How can I create a grouped bar plot in R using the ggplot and aes functions?
[英]How do I create a grouped percent plot in R using ggplot?
下面的代码生成一个示例数据集 -
x = c(rep("Category1",5), rep("Category2", 8), rep("Category3", 7))
y = c(rep("No", 2), rep("I don't know", 1), rep("Yes", 2), rep("No", 2), rep("I don't know", 2), rep("Yes", 2), rep("No", 2), rep("I don't know", 3), rep("Yes", 2),rep("No", 2))
df = data.frame(x,y)
colnames(df) = c("Category", "Response")
我正在尝试获取“响应”列的百分比图(使用 ggplot)。 到目前为止,我已经能够使用 - 获得“响应”的道具表
total = df %>%
count(Response) %>%
mutate(prop=prop.table(n))
total
要得到
Response n prop
1 I don't know 6 0.3
2 No 8 0.4
3 Yes 6 0.3
现在,我想为是、否和我不知道绘制这些百分比的条形图,并用这些百分比标记条形图。
接下来我想绘制同样的东西,但这次按“类别”分组。 我使用了下面的代码 -
df1 = df %>%
count(Category, Response) %>%
group_by(Category) %>%
mutate(prop=prop.table(n))
df1
得到这个输出 -
Category Response n prop
<chr> <chr> <int> <dbl>
1 Category1 I don't know 1 0.2
2 Category1 No 2 0.4
3 Category1 Yes 2 0.4
4 Category2 I don't know 2 0.25
5 Category2 No 4 0.5
6 Category2 Yes 2 0.25
7 Category3 I don't know 3 0.429
8 Category3 No 2 0.286
9 Category3 Yes 2 0.286
正如您现在看到的,道具是类别的百分比。 我是 ggplot 的新手,我似乎所做的只是绘制实际计数而不是类别的百分比。 我已经开始 -
ggplot(df, aes(Category))+
geom_bar()
但是我似乎无法理解如何将美学更改为百分比。
我认为您应该使用您在df1
计算出的比例并使用geom_col
,这相当于geom_bar(stat = "identity")
,这意味着条形高度将由您传递的 y 值而不是计数给出。
默认情况下,每个类别中的百分比将堆叠在一起,因此您可以使用填充美学来挑选它们。
使用geom_text
写出实际百分比通常也很有帮助,但这不是每个人都喜欢的,所以如果你愿意,你可以删除geom_text
调用,其余的情节将保持不变。
最后,由于我们想显示百分比而不是比例,我们使用scales::percent
作为标记 y 轴的速记方式。
ggplot(df1, aes(Category, prop, fill = Response))+
geom_col() +
geom_text(aes(label = scales::percent(prop)),
position = position_stack(vjust = 0.5)) +
scale_y_continuous(labels = scales::percent)
您可以更改样式,包括颜色、背景和位置:
ggplot(df1, aes(Category, prop, fill = Response))+
geom_col(width = 0.8, position = position_dodge(width = 0.8),
color = "forestgreen") +
geom_text(aes(y = prop/2, label = scales::percent(prop)),
position = position_dodge(width = 0.8)) +
scale_y_continuous(labels = scales::percent) +
theme_classic() +
scale_fill_brewer(palette = "Greens") +
theme(panel.grid.minor = element_line(),
panel.grid.major = element_line())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.