如何用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
关键说明
interaction(Fiscal_Year, Budget_Year):把两个分类变量组合成新的x轴类别,确保每个财年和预算年度的组合对应一个独立的条形位置,实现并列效果position = "stack":让同一条形内的Funding_Type对应的数值堆叠,而不是分开成独立条形scale_alpha_manual:自定义两种资金类型的透明度,让已拨款(不透明)和已申请(半透明)的区分更直观scale_x_discrete:修改x轴标签,让每个条形对应的财年和预算年度信息更清晰
内容的提问来源于stack exchange,提问作者Harry Kalsted
相关产品推荐
相关产品推荐

