首页 > 解决方案 > 在组内为 pre-post 笼式数据 ggplot barplot 添加百分比标签

问题描述

我是 R 新手,在将百分比标签添加到 post-post 条形图时遇到了一些麻烦。数据与此类似:

pre<-c("yes", "no", "no", "maybe", "yes", "yes", "no", "yes", "yes", "yes")
post<-c("no", "no", "maybe", "yes", "no", "no", "no", "yes", "no", "maybe")
dat<-as.data.frame(cbind(pre,post)

在该站点的大量帮助下,我已经弄清楚了如何使用以下代码创建条形图:

dat %>%
  gather(key,value) %>%
  mutate(value_ordered=factor(value, levels=c("no", "maybe","yes"))) %>%
  ggplot(aes(x=value_ordered,fill=key)) +
  geom_bar(aes(y=(..count../sum(..count..))), position = "dodge") +
  scale_y_continuous(label=percent) +
  xlab("Pre/post") + ylab("") +
  theme(axis.text.x=element_text(angle=60, hjust=1), legend.title=element_blank()) 

这产生了这个情节:[pre/post plot][1] 抱歉,我是该网站的新手,它不会让我发布图片。

我希望做的是在每个栏上方添加组内百分比文本以进行比较,因此所有“前”栏加起来为 100%,所有“后”栏加起来为 100%,但大多数我发现在每个条形上方为整个数据集提供百分比文本,而不是在每个组内。我希望这是有道理的。感谢您的任何见解或帮助。

标签: rggplot2geom-bar

解决方案


一种方法是创建一个列之外的列ggplot,将提供每个变量的累积总和。因此,除了value_ordered您创建的列之外,您还可以为计数和累积计数添加新列,如下所示:

library(tidyr)
library(dplyr)

d <- dat %>% pivot_longer(everything(), names_to = "Names", values_to = "Values") %>%
  mutate(value_ordered=factor(Values, levels=c("no", "maybe","yes")))%>%
  group_by(Names, value_ordered) %>% summarise(Count = n()) %>%
  mutate(Percent = Count / sum(Count)*100)  

# A tibble: 6 x 4
# Groups:   Names [2]
  Names value_ordered Count Percent
  <chr> <fct>         <int>   <dbl>
1 post  no                6      60
2 post  maybe             2      20
3 post  yes               2      20
4 pre   no                3      30
5 pre   maybe             1      10
6 pre   yes               6      60

现在,您可以在以下代码中将此列CumPer用作直方图每个条的标签:

library(ggplot2)
library(scales)

ggplot(d, aes( x= value_ordered, y = Percent/100, fill = Names, label = paste(Percent,"%")))+
  geom_bar(stat = "identity", position = position_dodge())+
  geom_text(position = position_dodge(.9), vjust = -0.5)+
  scale_y_continuous(labels = percent) + 
  xlab("Pre/post") + ylab("") +
  theme(axis.text.x=element_text(angle=60, hjust=1), legend.title=element_blank()) 

在此处输入图像描述 它看起来像您期望的那样吗?


推荐阅读