如何在R中绘制多变量同图条形图:按患者ID分组展示4类细胞计数
R语言分组并列条形图实现方案
方案选择建议
优先直接绘制合并的分组条形图,展示逻辑更直观,也不需要额外处理多图拼接的对齐问题。仅当4类细胞计数的数值量级相差超过100倍、无法在同一Y轴刻度下清晰展示所有指标时,再考虑分面或多图拼接。
分步操作指导
1. 数据格式预处理
你需要先将宽格式的原始数据集转换为长格式,这是ggplot绘制分组图的核心前提,基础绘图也可以基于转换后的数据快速生成矩阵。
假设你的原始宽表结构如下:
| PatientID | 总细胞计数 | 1区细胞计数 | 2区细胞计数 | 3区细胞计数 |
|---|---|---|---|---|
| P01 | 1200 | 320 | 480 | 400 |
| P02 | 950 | 250 | 350 | 350 |
| P03 | 1400 | 400 | 500 | 500 |
转换为长表的代码:
# 加载所需包 library(tidyr) library(ggplot2) # 转换为长表:将4个计数列合并为2列,一列存指标名称,一列存对应的计数值 df_long <- pivot_longer( data = 你的原始数据集名, # 替换为你自己的数据集变量名 cols = -PatientID, # 除了PatientID外,其他列都参与转换 names_to = "指标类型", # 新生成的列,存储原来的列名(总细胞/1区等) values_to = "细胞计数" # 新生成的列,存储对应的数值 )
2. ggplot2绘制分组并列条形图(推荐)
核心参数为position = "dodge",可实现同一PatientID下多根条形并列展示:
ggplot(data = df_long, aes(x = PatientID, y = 细胞计数, fill = 指标类型)) + # stat="identity"表示直接使用y列的原始值作为条形高度 # position="dodge"表示并列排布,可改为position_dodge(0.8)调整柱子间距 geom_bar(stat = "identity", position = "dodge", width = 0.7) + # 自定义标签 labs(x = "患者ID", y = "细胞计数", fill = "计数类别") + # 调整x轴标签角度,避免患者ID重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
3. 基础barplot函数绘制分组并列条形图
如果习惯用基础绘图函数,可基于原始宽表直接生成矩阵后绘图:
# 提取4个计数列转为矩阵,行对应4类指标,列对应患者 count_matrix <- t(as.matrix(你的原始数据集名[, c("总细胞计数", "1区细胞计数", "2区细胞计数", "3区细胞计数")])) # beside=TRUE是并列排布的核心参数,默认FALSE为堆叠 barplot(count_matrix, beside = TRUE, names.arg = 你的原始数据集名$PatientID, # x轴标签为患者ID col = c("darkblue", "red", "green", "orange"), # 自定义4类指标的颜色 xlab = "患者ID", ylab = "细胞计数") # 添加图例 legend("topright", legend = c("总细胞计数", "1区细胞计数", "2区细胞计数", "3区细胞计数"), fill = c("darkblue", "red", "green", "orange"))
特殊场景方案:分面展示(数值差异过大时使用)
如果4类指标数值差距极大,比如总细胞计数是105级别,分区计数只有102级别,同一Y轴下分区的条形会几乎不可见,此时可以用分面替代手动拼接4张图:
ggplot(data = df_long, aes(x = PatientID, y = 细胞计数, fill = 指标类型)) + geom_bar(stat = "identity", show.legend = FALSE) + # 按指标类型分面,每个面使用独立的Y轴刻度 facet_wrap(~指标类型, nrow = 1, scales = "free_y") + labs(x = "患者ID", y = "细胞计数") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者Sk8erPhD
相关产品推荐
相关产品推荐

