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

如何绘制每层按细胞状态比例着色的克隆分组堆叠条形图?

堆叠条形图实现方案

需求说明

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:10:23