如何用ggplot将总CD8细胞数拆分为堆叠条形图展示?
用ggplot实现CD8细胞数的堆叠条形图方法
要把总CD8细胞数分解为不同组织类型的堆叠条形图,核心是先把你的宽格式数据集转换成长格式,再用ggplot的填充映射区分不同组织。
步骤1:转换数据格式
你的数据集目前是宽格式(每个ROI一行,列包含tumor_cd8、epi_cd8、stroma_cd8、necro_cd8),需要转成长格式——让每个组织类型的CD8数单独占一行。用tidyverse包的pivot_longer函数就能搞定:
# 加载tidyverse(包含dplyr和ggplot2) library(tidyverse) # 假设你的数据集名为df,转换成长格式 df_long <- df %>% pivot_longer( cols = c(tumor_cd8, epi_cd8, stroma_cd8, necro_cd8), # 指定要转换的列 names_to = "tissue_type", # 新生成的组织类型列名 values_to = "cd8_count" # 新生成的CD8细胞数列名 )
步骤2:绘制堆叠条形图
用转换后的长格式数据,直接用geom_col()(适合已有汇总值的条形图),把fill参数映射到tissue_type,就能自动生成堆叠效果:
ggplot(df_long, aes(x = roi_id, y = cd8_count, fill = tissue_type)) + geom_col() + # 默认就是堆叠模式,position="stack"可省略 labs( x = "ROI编号", y = "CD8细胞数", fill = "组织类型", title = "各ROI内不同组织的CD8细胞数堆叠图" ) + theme_minimal() # 可选,调整主题样式
额外实用技巧
- 若
total_cd8是四个组织CD8数的总和,堆叠后的条形高度会自动等于total_cd8,无需额外处理。 - 可用
scale_fill_manual()自定义填充颜色:scale_fill_manual(values = c( "tumor_cd8" = "#E64B35", "epi_cd8" = "#4DBBD5", "stroma_cd8" = "#00A087", "necro_cd8" = "#3C5488" )) - 要在堆叠条上显示具体数值,添加
geom_text()即可:geom_text(aes(label = cd8_count), position = position_stack(vjust = 0.5))
内容的提问来源于stack exchange,提问作者fgootkind
相关产品推荐
相关产品推荐

