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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:27:04