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
相关产品推荐
相关产品推荐

