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

ggplot堆叠条形图:如何让分组内堆叠按n值排序?

分组堆叠条形图的组内排序问题

问题背景

现有如下DataFrame:

Race                  n    ID
White               7000   A
Black               1200   A
Asian               300    A
Unknown             100    A
Native American      50    A
Alaska Native        20    A
Other                5     A
White                300   B
Black                50    B
Unknown              20    B
Asian                10    B
Other                5     B

需要创建以A、B为分组的堆叠条形图,要求每个分组内的堆叠按n值排序。使用了以下代码:

ggplot(race_df) +
  aes(x = ID,
      y = n,
      fill = reorder(Race,n)) +
  geom_bar(position = "fill", stat = "identity") 

结果A组堆叠排序正确,但B组未按n值排序。疑问:是否因两组Race值不全相同导致?如何解决?

原因分析

确实是因为两组Race值不完整——A组包含Native American和Alaska Native,但B组没有这两个类别。reorder(Race, n)是基于整个数据集的n值对Race做全局排序,而非按每个ID分组单独排序,所以B组的堆叠会沿用全局排序规则,而非自身的n值顺序。

解决方法

要实现每个分组内单独按n值排序,需先对数据做预处理,给每个ID分组内的Race赋予基于组内n值的排序权重,再用这个权重指定填充色的顺序:

  1. 用dplyr和forcats对数据按ID分组,生成组内排序后的Race变量:
library(dplyr)
library(forcats)

race_df_sorted <- race_df %>%
  group_by(ID) %>%
  mutate(Race_sorted = fct_reorder(Race, n)) # 组内按n值从大到小排序Race
  ungroup()
  1. 绘图时使用处理后的Race_sorted作为填充变量,同时可以把图例名称改回原名称:
ggplot(race_df_sorted) +
  aes(x = ID, y = n, fill = Race_sorted) +
  geom_bar(position = "fill", stat = "identity") +
  labs(fill = "Race")

这样处理后,A和B组的堆叠都会各自按照组内的n值大小排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:15:38