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

R语言ggplot绘制条形图时如何同时嵌入多变量与生存标签

原提问内容

数据集信息

这是我的数据集:

dput(LSC)
structure(list(WBC = c(23.8, 162.4, 77.1, 155.1, 135.4, 23.3, 
NA, 88.2), Age = c(72.2638888888889, 65.0833333333333, 65.6972222222222, 
59.7666666666667, 22.7361111111111, 71.1972222222222, 67.7805555555556, 
46.8888888888889), Pre_leukemic_burden = c(96.2, 98.14, 100, 
99.84, 81.5, 97.64, 93.32, 100), Donor = structure(1:8, .Label = c("L1", 
"L2", "L3", "L4", "L5", "L6", "L7", "L8"), class = "factor"), 
    Survival = structure(c(2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L), .Label = c("Alive", 
    "Deceased"), class = "factor")), class = "data.frame", row.names = c(NA, 
-8L))

当前数据集包含Survival等分类变量,其余均为连续变量,我的目标是为每位患者展示WBC、Pre_leukemic_burden、Age三个指标的数值。
我已经写了如下代码:

df.long <- gather(LSC, variable,value, -Donor,-Survival)
df.long

ggplot(data = df.long, aes(x = Donor, y = value, fill = variable)) +
  geom_col(position = position_dodge())

上述代码已经可以实现需求,得到的效果如下图所示:
柱状图展示效果

提问内容

我还有Survival等多个分类变量,请问是否有方法可以将Survival标签整合到上述图表中?

解答

你可以通过以下3种常用方案实现需求,可根据展示场景选择:

  • 方案1:分面分组展示
    不需要改动原有柱状图的映射逻辑,通过facet_wrap按Survival字段分面,不同生存状态的患者会拆分到不同子图展示,可读性最高:
library(tidyverse)
# 也可以保留你原有的gather写法,pivot_longer是tidyr新语法兼容性更好
df.long <- LSC %>% 
  pivot_longer(cols = c(WBC, Age, Pre_leukemic_burden),
               names_to = "variable",
               values_to = "value")

ggplot(data = df.long, aes(x = Donor, y = value, fill = variable)) +
  geom_col(position = position_dodge()) +
  # 按生存状态分面,x轴可根据子图内容自适应
  facet_wrap(~Survival, scales = "free_x") +
  labs(x = "患者编号", y = "指标数值", fill = "指标类型")
  • 方案2:边框颜色标记
    对原有图表改动最小,用不同颜色的柱子边框区分Survival状态,适合需要在同一张图里展示所有患者的场景:
ggplot(data = df.long, aes(x = Donor, y = value, fill = variable, color = Survival)) +
  # 调整边框粗细提升辨识度
  geom_col(position = position_dodge(), size = 1.2) +
  # 自定义生存状态对应的边框颜色,也可以按需修改
  scale_color_manual(values = c("Alive" = "#2ECC71", "Deceased" = "#E74C3C")) +
  labs(x = "患者编号", y = "指标数值", fill = "指标类型", color = "生存状态")
  • 方案3:嵌套x轴标签
    通过ggh4x扩展包实现嵌套坐标轴,直接把Survival作为x轴的二级标签和患者编号放在一起,不需要额外图例或分面:
# 未安装依赖包先执行:install.packages("ggh4x")
library(ggh4x)
ggplot(data = df.long, aes(x = interaction(Donor, Survival), y = value, fill = variable)) +
  geom_col(position = position_dodge()) +
  # 配置嵌套坐标轴,自动拆分患者编号和生存状态作为两级标签
  scale_x_discrete(guide = guide_axis_nested(delim = ".")) +
  labs(x = "患者编号/生存状态", y = "指标数值", fill = "指标类型")

内容的提问来源于stack exchange,提问作者PesKchan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:54:03