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

如何用ggplot制作带明暗分层的并列分组条形图?

问题描述

我想制作一张展示各财年(Fiscal Year)支出情况的并列条形图,基础操作没问题,但没法实现在每个条形内用明暗效果区分已拨款(Appropriated)和已申请(Requested)的资金类型。目前代码会把这两种类型生成独立的条形,我需要它们在同一个条形内,按类别呈现深浅不同的明暗。

原尝试代码:

library(tidyverse)

project_data <- tibble(
  Project_Name = rep("Project A", 8),
  Budget_Year = c("2020_Budget","2020_Budget","2020_Budget","2020_Budget",
                  "2021_Budget","2021_Budget","2021_Budget","2021_Budget"),
  Fiscal_Year = c("2020", "2020", "2021", "2021", "2020", "2020", "2021", "2021"),
  Funding_Type = c("Appropriated", "Requested", "Appropriated", "Requested",
                   "Appropriated", "Requested", "Appropriated", "Requested"),
  Funding = runif(8, min = 1000000, max = 5000000)  
)

project_plot <- ggplot(project_data, aes(x = Fiscal_Year,
                                         y = Funding,
                                         fill = Budget_Year,
                                         alpha = Funding_Type)) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = scales::dollar) +
  labs(title = "Funding for Project A Over Time",
       x = "Fiscal Year",
       y = "Total Project Funding") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.title.x = element_text(size = 18),
    axis.title.y = element_text(size = 18),
    axis.text.x = element_text(size = 14),
    axis.text.y = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 16),
    panel.grid.major.y = element_line(colour = "grey"))

project_plot
解决方案

核心调整点:

  • 将x轴映射为Fiscal_Year和Budget_Year的交互项,确保每个财年-预算年度组合对应一个独立的条形位置
  • 把geom_col的position从"dodge"改为"stack",让同一条形内的两种资金类型堆叠显示
  • 固定alpha的取值,让明暗对比更清晰

修改后的代码:

library(tidyverse)

set.seed(123) # 设置随机种子保证结果可复现
project_data <- tibble(
  Project_Name = rep("Project A", 8),
  Budget_Year = c("2020_Budget","2020_Budget","2020_Budget","2020_Budget",
                  "2021_Budget","2021_Budget","2021_Budget","2021_Budget"),
  Fiscal_Year = c("2020", "2020", "2021", "2021", "2020", "2020", "2021", "2021"),
  Funding_Type = c("Appropriated", "Requested", "Appropriated", "Requested",
                   "Appropriated", "Requested", "Appropriated", "Requested"),
  Funding = runif(8, min = 1000000, max = 5000000)  
)

project_plot <- ggplot(project_data, 
                       aes(x = interaction(Fiscal_Year, Budget_Year), # 组合财年和预算年度作为x轴
                           y = Funding,
                           fill = Budget_Year,
                           alpha = Funding_Type)) +
  geom_col(position = "stack") + # 堆叠显示同一条形内的资金类型
  scale_alpha_manual(values = c(Appropriated = 1, Requested = 0.6)) + # 自定义明暗程度
  scale_x_discrete(labels = c("2020\n2020 Budget", "2021\n2020 Budget", 
                              "2020\n2021 Budget", "2021\n2021 Budget")) + # 优化x轴标签可读性
  scale_y_continuous(labels = scales::dollar) +
  labs(title = "Funding for Project A Over Time",
       x = "Fiscal Year & Budget Year",
       y = "Total Project Funding",
       alpha = "Funding Type") + # 明确图例标题
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.title.x = element_text(size = 18),
    axis.title.y = element_text(size = 18),
    axis.text.x = element_text(size = 14),
    axis.text.y = element_text(size = 14),
    legend.text = element_text(size = 14),
    legend.title = element_text(size = 16),
    panel.grid.major.y = element_line(colour = "grey"))

project_plot
关键说明
  1. interaction(Fiscal_Year, Budget_Year):把两个分类变量组合成新的x轴类别,确保每个财年和预算年度的组合对应一个独立的条形位置,实现并列效果
  2. position = "stack":让同一条形内的Funding_Type对应的数值堆叠,而不是分开成独立条形
  3. scale_alpha_manual:自定义两种资金类型的透明度,让已拨款(不透明)和已申请(半透明)的区分更直观
  4. scale_x_discrete:修改x轴标签,让每个条形对应的财年和预算年度信息更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:40:11