ggplot2绘制双离散变量堆叠条形图出现连续着色问题求助
问题原因
你当前代码存在两个核心问题,导致出图不符合预期:
- 传入
fill映射的var_2是数值型变量,ggplot2会默认将其识别为连续维度,自动分配连续配色,不会生成你要的离散分类配色。 - 数据集为宽表结构,你仅将
var_1映射到y轴,没有将var_2作为独立堆叠分段纳入绘图数据,堆叠逻辑本身不成立。
修正方案
ggplot2绘制堆叠条形图要求分组列(映射到fill的列)为离散分类类型,每个堆叠分段对应数据集的一行,因此需要先重构数据,再绘图:
- 计算每个分组下
var_1与var_2的差值(因你说明var_2始终小于var_1,差值恒为正) - 将宽表转为长表,把
var_2、差值两个分段的取值合并为同一数值列,对应的变量名转为分类列 - 将分类列转为因子类型强制识别为离散维度,再传入
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
相关产品推荐
相关产品推荐

