繁体   English   中英

如何使用 ggplot 在 R 中创建分组百分比图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM