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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:02