将百分比标签添加到堆积条形图ggplot2

Posted

技术标签:

【中文标题】将百分比标签添加到堆积条形图ggplot2【英文标题】:Add percentage labels to stacked bar chart ggplot2 【发布时间】:2018-06-04 18:57:15 【问题描述】:

我一直坚持在 ggplot2 中创建图表。我正在尝试创建一个带有百分比的堆积条形图,类似于此页面上的图表,但我正在努力在条​​形图中添加百分比标签:How to draw stacked bars in ggplot2 that show percentages based on group?

我找到的所有尝试添加百分比标签的答案都使用类似于代码的东西

geom_text(aes(label = label), position = position_stack(vjust = 0.5), 大小 = 2)

但它不适合我。

我的数据如下所示:

County  Group   Plan1   Plan2   Plan3   Plan4   Plan5   Total
County1 Group1  2019    597 513 5342    3220    11691
County2 Group1  521 182 130 1771    731 3335
County3 Group1  592 180 126 2448    1044    4390
County4 Group1  630 266 284 2298    937 4415
County5 Group1  708 258 171 2640    1404    5181
County6 Group1  443 159 71  1580    528 2781
County7 Group1  492 187 157 1823    900 3559
County8 Group1  261 101 84  1418    357 2221

没有百分比的我的图表如下所示:

代码:

melt(df[df$Group=="Group1",],measure.vars = c("Plan1","Plan2","Plan3","Plan4", "Plan5"),variable.name = "Counties",value.name = "value") %>% 
ggplot(aes(x=County,y=value,fill=Counties))+
  geom_bar(stat = "identity",position="fill", color="black", width=0.9) + 
  labs(y="Percent", fill="Plan Type") + ylab("Percentage") + coord_flip() + scale_y_continuous(labels=scales::percent)

使用上面的geom_text() 代码后,它变成了这个烂摊子:

代码:

melt(df[df$Group=="Group1",],measure.vars = c("Plan1","Plan2","Plan3","Plan4", "Plan5"),variable.name = "Counties",value.name = "value") %>% 
ggplot(aes(x=County,y=value,fill=Counties))+
  geom_bar(stat = "identity",position="fill", color="black", width=0.9) + 
  labs(y="Percent", fill="Plan Type") + ylab("Percentage") + coord_flip() + scale_y_continuous(labels=scales::percent)+ 
geom_text(aes(label=paste0(round(value/100),"%")), position=position_stack(vjust=0.5))

有什么建议吗?非常感谢任何建议/指导!谢谢!!

【问题讨论】:

你可以在制作条形图之前计算百分比df[, 3:7] <- df[, 3:7] / rowSums(df[, 3:7])我猜你有更多的组,所以你需要通过“组”来做这个 【参考方案1】:

您的方法不起作用,因为标签不是 % 而是原始值。你必须自己做统计:

df <- read.table(text="County  Group   Plan1   Plan2   Plan3   Plan4   Plan5   Total
County1 Group1  2019    597 513 5342    3220    11691
                 County2 Group1  521 182 130 1771    731 3335
                 County3 Group1  592 180 126 2448    1044    4390
                 County4 Group1  630 266 284 2298    937 4415
                 County5 Group1  708 258 171 2640    1404    5181
                 County6 Group1  443 159 71  1580    528 2781
                 County7 Group1  492 187 157 1823    900 3559
                 County8 Group1  261 101 84  1418    357 2221", header = TRUE)

library(tidyverse)
df %>% 
  filter(Group == "Group1") %>% 
  select(-Total) %>% 
  gather(key = `Plan Type`, value = value, -County, -Group) %>% 
  group_by(County, Group) %>% 
  mutate(Percentage = value/sum(value)) %>% 
  ggplot(aes(x = County, y = Percentage, fill = `Plan Type`, label = paste0(round(Percentage*100), "%"))) +
  geom_col(position = position_stack(), color = "black") +
  geom_text(position = position_stack(vjust = .5)) +
  coord_flip() +
  scale_y_continuous(labels = scales::percent_format())

编辑:

上面的代码也适用于更多计划和更多组,但情节不会考虑到这一点。只需添加facet_wrap 即可生成关于组的灵活图:

df %>% 
      filter(Group == "Group1") %>% 
      select(-Total) %>% 
      gather(key = `Plan Type`, value = value, -County, -Group) %>% 
      group_by(County, Group) %>% 
      mutate(Percentage = value/sum(value)) %>% 
      ggplot(aes(x = County, y = Percentage, fill = `Plan Type`, label = paste0(round(Percentage*100), "%"))) +
      geom_col(position = position_stack(), color = "black") +
      geom_text(position = position_stack(vjust = .5)) +
      coord_flip() +
      scale_y_continuous(labels = scales::percent_format()) +
      facet_wrap(~Group)

【讨论】:

以上是关于将百分比标签添加到堆积条形图ggplot2的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:ggplot2可视化水平堆叠条形图并且在每个堆叠条形图的内部居中添加百分比文本标签信息

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签

如何从ggplot2中的两个不同的二进制值列绘制百分比堆积条形图?

带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图

带有facet_grid的ggplot2中带有多个分类变量的堆积条形图

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签