如何用ggplot和dplyr将完成项目的绝对计数条形图改为比例图
各年龄组项目完成比例条形图实现方案
方法一:先预处理数据再绘图
先通过dplyr分组计算每个年龄组的完成比例,再用ggplot绘制:
library(dplyr) library(ggplot2) # 计算各年龄组的完成比例 processed_data <- test %>% group_by(agecat) %>% summarise( completion_rate = mean(retain_yn == 1) # 0/1变量的均值即为完成比例 ) # 绘制比例图 ggplot(processed_data, aes(x = agecat, y = completion_rate)) + geom_bar(stat = "identity", fill = "#4285F4") + # 添加百分比标签 geom_text(aes(label = scales::percent(completion_rate)), vjust = -0.2, size = 3) + # 设置y轴为百分比格式,扩展范围防止标签被截断 scale_y_continuous(labels = scales::percent, limits = c(0, 1.1)) + labs( x = "年龄组", y = "项目完成比例", title = "各年龄组项目完成情况比例" ) + theme_bw()
方法二:直接在ggplot中计算比例(无需单独预处理)
利用stat_summary直接在绘图时计算每个组的完成比例,适合快速绘图:
library(ggplot2) library(scales) ggplot(test, aes(x = agecat, y = retain_yn)) + # 用stat_summary计算并绘制比例条形 stat_summary(fun = mean, geom = "bar", fill = "#34A853") + # 添加百分比标签 stat_summary( fun = mean, geom = "text", aes(label = percent(..y..)), vjust = -0.2, size = 3 ) + scale_y_continuous(labels = percent, limits = c(0, 1.1)) + labs( x = "年龄组", y = "项目完成比例", title = "各年龄组项目完成情况比例" ) + theme_minimal()
关键说明
- 由于
retain_yn是0(未完成)和1(完成)的二元变量,对每个年龄组取均值就等于该组的完成比例,这是简化计算的核心技巧。 scales::percent()函数用于将小数转换为百分比格式,提升图表可读性。- 调整
vjust参数可以控制标签在条形上方的位置,limits = c(0, 1.1)扩展y轴范围,避免标签被图表边界截断。
内容的提问来源于stack exchange,提问作者EtoiledeMoyenOrient
相关产品推荐
相关产品推荐

