为事前笼状数据ggplot barplot添加组内标签百分比

问题描述 投票:1回答:1

我对R不熟悉,在将百分比标签添加到柱前柱形图时遇到了一些麻烦。数据与此类似:

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()) 

产生此图:[剧情前后] [1]抱歉,我是该网站的新手,它还不允许我发布图像。

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

r ggplot2 geom-bar
1个回答
0
投票

一种方法是在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) %>%
  mutate(CumPer = cumsum(Percent))

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

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

library(ggplot2)
library(scales)

ggplot(d, aes( x= value_ordered, y = Percent/100, fill = Names, label = paste(CumPer,"%")))+
  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()) 

enter image description here

看起来像您所期望的吗?

© www.soinside.com 2019 - 2024. All rights reserved.