求助:使用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
相关产品推荐
相关产品推荐

