如何用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
相关产品推荐
相关产品推荐

