r - 在组内为 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%,但大多数我发现在每个条形上方为整个数据集提供百分比文本,而不是在每个组内。我希望这是有道理的。感谢您的任何见解或帮助。
解决方案
一种方法是创建一个列之外的列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())
推荐阅读
- apache-spark - 将 Spark SQL 批处理源转换为结构化流接收器
- javascript - 使用 React app .JS Promise 的 Google 登录未初始化 client_id
- mysql - Windows 上的 Docker 尝试启动 mysql 容器时出错
- aws-glue - 我可以在基于 Python 的 Glue 作业中对 Glue 连接执行任意 SQL 吗?
- javascript - 如何将一个对象旋转到另一个对象(慢慢地)
- c - C程序打印换行符
- visual-studio-2017 - Fortran 间歇性类型错误
- java - 使用 logback 停用 AWS Lambda Cloudwatch 上的调试日志记录
- javascript - 如何使用 node-module-version 57 安装 node-opus
- regex - 正则表达式返回括号之间有 1 个或多个句点的文本