如何在ggplot中实现堆叠与簇状结合的条形图并自定义配色
该需求可实现,调整后完整代码及说明如下:
# 加载依赖包 library(tidyverse) library(plotly) # 原始数据 dates_g <- as.Date(c("2020-03-30","2020-03-30", "2020-04-30","2020-04-30", "2020-05-30","2020-05-30")) value_x <- c(1, 2, 4, 1.4, 3.2, 1.3) value_y <- c(1.2, 3, 4.6, 1, 3, 1) ID <- c("A", "B", "A", "B", "A", "B") results <- data.frame(dates_g, value_x, value_y, ID) # 数据重构:宽表转长表,新增分组标识 results_long <- results %>% pivot_longer(cols = starts_with("value"), names_to = "value_group", values_to = "value") %>% # 生成填充色映射的组合变量 mutate(fill_key = interaction(ID, value_group)) # 绘图参数 bar_width <- 0.35 dodge_width <- 0.7 bar_comparison <- ggplot(results_long, aes(x = dates_g, y = value, fill = fill_key, group = value_group)) + # 同时实现堆叠+簇状效果 geom_col(position = position_stack(), width = bar_width, position_dodge(width = dodge_width)) + # 日期刻度默认对齐两个条形中间 scale_x_date(date_labels = "%Y-%m-%d", breaks = unique(results$dates_g)) + # 手动指定填充色 scale_fill_manual( values = c( "A.value_x" = "#006400", # 深绿:value_x组A "B.value_x" = "#90EE90", # 浅绿:value_x组B "A.value_y" = "#00008B", # 深蓝:value_y组A "B.value_y" = "#ADD8E6" # 浅蓝:value_y组B ), # 自定义图例展示文字,可按需修改 labels = c("A-指标1", "B-指标1", "A-指标2", "B-指标2"), name = "分组" ) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + xlab("Date") + ylab("Value (in millions)") # 转交互式图表 ggplotly(bar_comparison)
核心修改说明
- 数据格式转换:将原始宽数据转为长数据,新增指标分组标识,避免重复调用两次
geom_bar,同时为簇状分组和颜色映射提供变量基础。 - 日期标签自动居中:放弃手动给日期加偏移量的写法,通过
position_dodge控制同一日期下两个堆叠条形的间距,x轴直接使用原始日期作为刻度,默认会显示在两个条形的正中间,无需额外手动调整。 - 自定义色系配置:通过ID和指标分组的组合变量作为填充色映射字段,手动指定四个对应色值即可实现左侧绿色系、右侧蓝色系,且同指标下A为深色、B为浅色的需求,可自行修改十六进制色值调整配色。
内容的提问来源于stack exchange,提问作者unter_983
相关产品推荐
相关产品推荐

