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

如何用R ggplot2绘制配色独立的并列堆叠柱状图

可以实现,推荐使用ggnewscale包为不同分组设置独立的填充色标度,以下是完整可运行的实现代码:

# 加载所需包
library(dplyr)
library(ggplot2)
library(ggnewscale)

# 原数据生成逻辑
prob.out = function(lam){
  out1 = dpois(x = 0:3, lambda = lam)
  return(c(1-sum(out1), sort(out1)))
}
Prob.out = Vectorize(prob.out, SIMPLIFY = "vector")

synth.data = data.frame(
  year = rep(2019:2021, each = 10) %>% as.character(), 
  small.cat = rep(rep(c("a", "b"), each = 5), times = 3), 
  response.var = round(c(Prob.out(lam = c(1, .7, .9, .6, .8, .5)))*10000,0)
)

# 新增堆叠分组变量,区分同一个small.cat下的不同堆叠段
synth.data <- synth.data %>%
  group_by(year, small.cat) %>%
  mutate(stack_group = as.character(row_number())) %>%
  ungroup()

# 绘图代码
ggplot(data = synth.data, aes(x = small.cat, y = response.var)) +
  # 先绘制small.cat为a的图层,使用蓝色系配色
  geom_col(data = ~filter(.x, small.cat == "a"), 
           aes(fill = stack_group), position = "fill") +
  scale_fill_brewer(palette = "Blues", name = "a类堆叠分组") +
  # 重置填充标度,为b类设置独立配色
  new_scale_fill() +
  # 绘制small.cat为b的图层,使用橙色系配色
  geom_col(data = ~filter(.x, small.cat == "b"), 
           aes(fill = stack_group), position = "fill") +
  scale_fill_brewer(palette = "Oranges", name = "b类堆叠分组") +
  # 按年分面
  facet_wrap(~year)

核心逻辑说明

  • 先对原始数据新增stack_group变量,用来标识同一个small.cat分组下不同的堆叠段,作为填充色的映射变量
  • 分两次调用geom_col分别绘制两个small.cat类别的柱状图,中间用new_scale_fill()重置填充色的映射规则,即可实现两套独立的配色方案
  • 你可以根据需要替换scale_fill_brewer为scale_fill_manual自定义任意配色,调整图例名称等参数即可匹配你的目标效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:45:01