如何绘制每层按细胞状态比例着色的克隆分组堆叠条形图?
堆叠条形图实现方案
需求说明
- X轴:代表共享同一克隆的唯一sample_id数量的bin(对应数据中的
bin_id) - Y轴:每个bin中的克隆数量
- 堆叠层规则:每个克隆对应的堆叠层,根据该克隆细胞的
status(red/blue)占比分色,例如某克隆含40%red、60%blue细胞,则对应层按该比例呈现红、蓝两部分
示例数据
new_df <- structure(list(clone_id = c(101, 101, 101, 101, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104), sample_id = c(201, 201, 202, 202, 203, 204, 205, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 208), status = c("red", "red", "blue", "blue", "red", "blue", "red", "blue", "blue", "blue", "red", "red", "red", "red", "red", "red", "red", "blue"), bin_id = c(4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8), perc_red = c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.25, 0.25, 0.25, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875), perc_blue = c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125)), class = "data.frame", row.names = c(NA, -18L))
现有问题代码
ggplot(data, aes(fill=clone_id, y=clone_id, x=bin_id)) + geom_bar(position="stack", stat="identity")
问题点:Y轴映射错误,且未实现克隆层内按status占比分色的效果
解决方案
1. 数据预处理
先聚合得到克隆级别的统计数据,将宽格式的百分比转为长格式,适配ggplot的映射逻辑:
library(dplyr) library(tidyr) # 去重并转换数据格式 clone_summary <- new_df %>% distinct(clone_id, bin_id, perc_red, perc_blue) %>% pivot_longer( cols = c(perc_red, perc_blue), names_to = "status", values_to = "percentage", names_prefix = "perc_" )
2. 绘制目标堆叠条形图
library(ggplot2) ggplot(clone_summary, aes(x = factor(bin_id), y = percentage, group = clone_id, fill = status)) + geom_col(position = "stack", color = "white") + # 白色边框区分不同克隆层 scale_y_continuous( breaks = seq(0, max(clone_summary %>% count(bin_id)$n), 1), labels = seq(0, max(clone_summary %>% count(bin_id)$n), 1) ) + labs( x = "共享同一克隆的唯一样本数Bin", y = "克隆数量", fill = "细胞状态" ) + theme_minimal()
关键逻辑说明
distinct():去除同一克隆的重复记录,确保每个克隆仅参与一次绘图计算pivot_longer():将每个克隆的red/blue百分比转为长格式,让ggplot可以按status映射填充色group = clone_id:指定以克隆为单位进行堆叠,每个克隆对应一个独立的堆叠层y = percentage:控制每个克隆层内红、蓝部分的高度占比,所有克隆的百分比总和为1,堆叠后每个bin的总高度正好等于该bin内的克隆数量scale_y_continuous():将Y轴刻度设置为整数,直观展示克隆数量
内容的提问来源于stack exchange,提问作者cnicholas
相关产品推荐
相关产品推荐

