如何在ggplot2中展示组内特定类别占比且仅保留对应柱子?
解决方法:先计算组内真实占比再绘图
直接过滤complications == "2"后占比全为100%,是因为过滤后每组只剩并发症患者,stat="count"计算比例时会以过滤后的组内人数为分母,而非原组的总人数。要得到真实的组内占比,需要先提前计算每组中并发症患者的比例,再基于汇总数据绘图。
步骤1:预处理数据,计算组内并发症占比
用dplyr分组统计每组总人数、并发症患者数,再算出占比:
library(dplyr) library(ggplot2) # 生成汇总统计数据 summary_df <- DiabetesAndCRC3_only_rectal %>% group_by(Diabetes_status) %>% summarise( total = n(), comp_count = sum(complications == "2"), comp_percent = comp_count / total )
步骤2:绘制仅显示并发症占比的柱状图
基于汇总后的数据绘图,直接用stat="identity"绘制计算好的占比:
ggplot(summary_df, aes(x = Diabetes_status, y = comp_percent)) + geom_bar(stat = "identity", fill = "#2E86AB") + # 自定义填充色 geom_text(aes(label = scales::percent(comp_percent)), vjust = -0.5, size = 4) + # 百分比标签置于柱子上方 labs( x = "糖尿病状态", y = "并发症患者占比", title = "不同糖尿病状态组的并发症患者占比" ) + scale_y_continuous(labels = scales::percent, limits = c(0, max(summary_df$comp_percent) + 0.1)) + # 调整y轴范围,避免标签被截断 theme_minimal()
可选:保留分面布局(如果需要)
如果你坚持要用facet_grid,可以将x轴设为固定类别,再分面展示:
ggplot(summary_df, aes(x = "有并发症", y = comp_percent)) + geom_bar(stat = "identity", fill = "#2E86AB") + geom_text(aes(label = scales::percent(comp_percent)), vjust = -0.5, size = 4) + facet_grid(~Diabetes_status) + labs( x = "", y = "并发症患者占比" ) + scale_y_continuous(labels = scales::percent, limits = c(0, max(summary_df$comp_percent) + 0.1)) + theme_minimal()
内容的提问来源于stack exchange,提问作者ERBECK92
相关产品推荐
相关产品推荐

