如何在ggplot2中按月度成交量动态调整堆叠柱状图的堆叠顺序
解决方案
要实现堆叠柱状图每月的堆叠顺序随当月行业成交量动态调整,无需手动为每个月设置因子,仅需对数据做简单排序+调整ggplot映射规则即可,修改后的可运行代码如下:
步骤1:修正依赖并预处理数据
library(dplyr) library(ggplot2) # 原代码笔误修正:是ggplot2而非ggplot library(ggtext) library(scales) library(forcats) # 按月份分组,按成交量升序排列(大值会在堆叠底部,如需大值在顶部改为desc(volume)即可) test_sorted <- test %>% group_by(Date) %>% arrange(volume, .by_group = TRUE) %>% ungroup()
步骤2:修改绘图逻辑
graph <- test_sorted %>% ggplot(aes(x=Date)) + # 核心修改:新增group映射,按排序后的顺序生成分组因子,控制堆叠顺序 geom_bar(aes(x=Date, y=volume, fill = Industry, group = fct_inorder(paste(Date, Industry))), stat="identity") + ## 原有配置仅做两处小修正,其余保留不变 ggtitle(label = "**Volume**", subtitle = "By Industry") + ylab("Volume (Millions)") + xlab("") + scale_fill_manual(values=c("#e3120b", "#336666", "#FB9851", "#acc8d4", "#dbcc98", "#36E2BD"), # 新增breaks参数:固定图例顺序,避免图例随堆叠顺序变化乱序 breaks = unique(test$Industry)) + scale_x_date(date_breaks = "month", labels = scales::label_date_short()) + scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6, accuracy = 1)) + # 原代码笔误修正:控制fill图例而非col图例 guides(fill = guide_legend(ncol = 2, nrow = 3)) + theme_minimal() + theme(text = element_text(family = "Georgia"), panel.border=element_blank(), axis.line=element_line(), plot.title = element_markdown(color="black", size=14, hjust = .5), plot.subtitle = element_text(hjust = .5), axis.title.x = element_text(size = 9, color = "grey30"), axis.title.y = element_text(size = 9, color = "grey30"), legend.box.background = element_rect(color="black", size=.5), legend.title = element_blank(), legend.text = element_text(size = 6), legend.position = "bottom", strip.background = element_rect(linetype="solid",), panel.grid.minor.y = element_line(color = NA), panel.grid.minor.x = element_line(color = NA), plot.caption = ggtext::element_markdown(hjust = 1, size = 7, color = "#7B7D7D"))
实现原理
- 先按月份分组对成交量排序,保证每个月的行业行顺序和需要的堆叠顺序一致
- 用
fct_inorder将「月份+行业」的组合按数据行顺序生成因子作为group映射,ggplot会严格按照这个group的顺序堆叠,自动适配每个月的成交量排序 - 新增的
breaks参数保证图例顺序固定,不会随堆叠顺序变化发生混乱 - 该逻辑兼容任意时长的时间序列数据,无需额外手动配置
内容的提问来源于stack exchange,提问作者otteheng
相关产品推荐
相关产品推荐

