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

R语言ggplot绘制含负值堆叠条形图的负向堆叠顺序调整问题

解决方案

首先修正你提供的数据集里的语法错误:原Number_of_Genes列末尾的-901 -11699缺少逗号,改为-901, -11699即可正常加载数据。

你需要的堆叠顺序调整可以通过拆分正负值子集、分别设置堆叠方向实现,完整代码如下:

# 加载依赖包
library(ggplot2)

# 加载修正后的数据集
df<- data.frame(Comparison=c("Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA",
                             "SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA",
                             "Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS",
                             "HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS"),
                LFC_Band=c(-4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4),
                Number_of_Genes=c(-36,-540,-2198,-3025,-6002,6517,3462,2466, 500,1,-620,-2317,-3318,-2748,-2264,2706,2046,3079,3013,2073,-119,-606,
                                  -1640,-2886,-7451,6944,3147,1592, 267,0,26,0,0, -44,-901, -11699,10969, 754,0,12,0))

# 将LFC_Band转为有序因子,固定顺序保证颜色映射和堆叠逻辑一致
df$LFC_Band <- factor(df$LFC_Band, levels = c(-4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4))

# 拆分正负值子集
df_pos <- df[df$Number_of_Genes > 0, ]
df_neg <- df[df$Number_of_Genes < 0, ]

# 绘图
chart_x <- ggplot() +
  # 正值部分用默认堆叠顺序,从0向上依次堆叠大值到小值
  geom_col(data = df_pos, aes(x = Comparison, y = Number_of_Genes, fill = LFC_Band),
           position = position_stack(reverse = FALSE)) +
  # 负值部分反转堆叠顺序,从0向下依次堆叠绝对值小的到绝对值大的
  geom_col(data = df_neg, aes(x = Comparison, y = Number_of_Genes, fill = LFC_Band),
           position = position_stack(reverse = TRUE)) +
  scale_fill_brewer(palette = "Spectral")

chart_x

运行上述代码即可得到你预期的堆叠效果:正值区域从上到下为4→0.25,负值区域从下到上为-4→-0.25,0值会自动不渲染,不影响整体展示效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:06