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

求助:使用ggplot2绘制符合需求的百分比堆叠条形图

解决ggplot2百分比堆叠条形图的问题

我来帮你一步步搞定这些问题,核心是先修正数据处理的逻辑,再调整绘图参数:

1. 修正数据处理逻辑

你之前的gather把总reads数和百分比列混在一起了,这会导致数值逻辑混乱。我们需要先把百分比转换成实际的reads数量,再整理成适合堆叠的长格式数据:

# 加载依赖包
library(ggplot2)
library(tidyr)
library(scales)

# 你的示例数据
algin <- data.frame(
  sample = c("sample1", "sample2", "sample3", "sample4"),
  mapped_percent = c(96.5, 97.4, 92.1, 98.7),
  unmapped_percent = c(3.5, 2.6, 7.9, 1.3),
  reads = c(1320, 1451, 1824, 1563)
)

# 计算实际的mapped/unmapped reads数,再整理成堆叠所需的长格式
df <- algin %>%
  mutate(
    mapped = reads * mapped_percent / 100,
    unmapped = reads * unmapped_percent / 100
  ) %>%
  select(sample, mapped, unmapped) %>%  # 只保留需要的列,去掉总reads和原始百分比列
  pivot_longer(cols = c(mapped, unmapped), names_to = "type", values_to = "read_count")

2. 绘制符合需求的堆叠条形图

用整理好的数据绘图,完全匹配你的三个需求:

ggplot(df, aes(x = sample, y = read_count, fill = type)) +
  geom_col(position = position_stack()) +  # 生成堆叠条形图
  coord_flip() +  # 翻转坐标轴,让样本名在y轴
  # 设置颜色映射:mapped对应深蓝色,unmapped对应深红色
  scale_fill_manual(
    name = "Reads Type",
    values = c("mapped" = "darkblue", "unmapped" = "darkred")
  ) +
  # 处理轴单位:添加M后缀(如果你的真实数据是千级,可把scale改成1e-3、后缀改成"K")
  scale_y_continuous(
    labels = label_number(suffix = "M", scale = 1e-6),
    name = "Total Reads"
  ) +
  labs(
    x = "Sample",
    title = "Mapped vs Unmapped Reads per Sample"
  ) +
  theme_minimal()

关键调整说明

  • 数据逻辑修正:通过mutate计算实际reads数,确保堆叠后的总长度等于样本的总reads数,避免百分比与总数混合的错误。
  • 颜色与图例:因为我们只保留了mapped和unmapped两类数据,图例自然只会显示这两个项,颜色映射完全符合你的要求。
  • 轴单位处理:用scales::label_number自动添加单位后缀,你可以根据真实数据的量级调整scale参数(比如千级数据用1e-3+"K")。

这样就能得到完全符合你预期的图表了!

内容的提问来源于stack exchange,提问作者Ming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:55