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

ggplot2绘制双离散变量堆叠条形图出现连续着色问题求助

问题原因

你当前代码存在两个核心问题,导致出图不符合预期:

  • 传入fill映射的var_2是数值型变量,ggplot2会默认将其识别为连续维度,自动分配连续配色,不会生成你要的离散分类配色。
  • 数据集为宽表结构,你仅将var_1映射到y轴,没有将var_2作为独立堆叠分段纳入绘图数据,堆叠逻辑本身不成立。
修正方案

ggplot2绘制堆叠条形图要求分组列(映射到fill的列)为离散分类类型,每个堆叠分段对应数据集的一行,因此需要先重构数据,再绘图:

  1. 计算每个分组下var_1与var_2的差值(因你说明var_2始终小于var_1,差值恒为正)
  2. 将宽表转为长表,把var_2、差值两个分段的取值合并为同一数值列,对应的变量名转为分类列
  3. 将分类列转为因子类型强制识别为离散维度,再传入fill映射即可生成离散配色的堆叠条形图

可直接运行的修正代码:

library(ggplot2)
library(dplyr)
library(tidyr)

# 原始数据
sampleData <-  data.frame(grp = c("A","B", "C"),
                          var_1 = c(15,20, 25),
                          var_2 = c(12, 13, 20))

# 重构绘图数据
plot_df <- sampleData %>%
  mutate(var_diff = var_1 - var_2) %>%
  pivot_longer(cols = c(var_2, var_diff),
               names_to = "var_type",
               values_to = "val") %>%
  mutate(var_type = as.factor(var_type))

# 绘图
p <- ggplot(plot_df, aes(x = grp, y = val, fill = var_type)) +
  geom_bar(stat = "identity", position = "fill") +
  # 可按需自定义配色、图例标签
  scale_fill_manual(values = c("#619CFF", "#F8766D"),
                    labels = c("var_2取值", "var_1超出var_2部分")) +
  coord_flip() +
  theme_bw()
p

可选调整

  • 如果需要展示实际数值堆叠而非百分比占比,将position = "fill"替换为position = "stack"即可
  • 如果需要调整图例顺序,可以修改因子var_type的水平顺序实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:18:20