You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:08:17