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

多层ggplot堆叠柱状图中分面内堆叠段按降序排列问题咨询

解决方案

问题原因

ggplot2默认的堆叠段顺序由fill映射的因子全局水平决定,无法适配不同分面、不同x轴类别下的自定义排序需求。你原代码中使用fct_reorder2生成的是class列的全局因子排序,自然无法满足每个分面、每个柱子内堆叠段按数值降序排列的要求。另外你原代码中加载的包名有误,正确的绘图包名称是ggplot2而非ggplot。

实现方法

方法1:使用tidytext包的分组排序工具(无需提前汇总数据)

该方法适合保留原始行级数据的场景,直接通过映射group参数实现分组内排序:

# 加载依赖包
library(ggplot2)
library(tidytext)

ggplot(mpg, aes(
  x = manufacturer, 
  y = cyl, 
  # 按年+厂商分组,对class按cyl求和值降序排序
  group = reorder_within(class, -cyl, list(year, manufacturer)),
  fill = class
)) +
  geom_col() +
  facet_wrap(.~year)

方法2:提前汇总数据后排序(适合需要预先统计的场景)

如果需要先对数据做聚合统计,可先分组求和再生成组内排序标识,映射到group参数即可:

# 加载依赖包
library(ggplot2)
library(dplyr)

# 数据预处理:分组求和+生成组内排序标识
mpgtest <- mpg %>%
  group_by(year, manufacturer, class) %>%
  summarise(total_cyl = sum(cyl), .groups = "drop") %>%
  group_by(year, manufacturer) %>%
  arrange(desc(total_cyl)) %>%
  mutate(group_order = row_number())

# 绘图
ggplot(mpgtest, aes(
  x = manufacturer, 
  y = total_cyl, 
  group = group_order,
  fill = class
)) +
  geom_col() +
  facet_wrap(.~year)

两种方法都可以实现每个分面下,每个厂商对应的堆叠柱内部的填充段按数值从高到低降序排列。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:01