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

如何在条形图中按x因子层级对填充变量升序排序?

分组条形图自定义排序问题

我需要制作一个分组条形图,要求:

  • x轴为manufacturer,条形填充颜色由class决定
  • 每个manufacturer分组内的条形按num(计数)升序排列
  • manufacturer的排序依据是各分组内的最小num值升序排列

我尝试了以下代码:

library(ggplot2)
library(tidyverse)

# 确定manufacturer的排序
manufacturer_order <- mpg %>%
  dplyr::group_by(manufacturer, class) %>%
  dplyr::summarise(num= dplyr::n()) %>%
  dplyr::group_by(manufacturer) %>%
  dplyr::arrange(num, .by_group = TRUE) %>%
  dplyr::mutate(dupl= duplicated(manufacturer)) %>%
  dplyr::filter(!dupl) %>%
  dplyr::arrange(num) %>%
  .$manufacturer
# 处理数据并按要求排序
mpg_ordered <- mpg %>%
  dplyr::mutate(manufacturer= factor(manufacturer, levels= manufacturer_order)) %>%
  dplyr::arrange(manufacturer) %>%
  dplyr::group_by(manufacturer, class) %>%
  dplyr::summarise(num= dplyr::n()) %>%
  dplyr::group_by(manufacturer) %>%
  dplyr::arrange(num, .by_group = TRUE)
# 绘图
mpg_ordered %>%
  ggplot(., aes(x= manufacturer, y= num, fill= class)) +
  geom_bar(stat= "identity", position = "dodge", color='black')

当前生成的图表存在问题:manufacturer的排序符合预期,但每个manufacturer分组内的class条形顺序不符合要求。比如第一个分组nissan内,条形顺序应该是compact(num=2)、suv(num=4)、midsize(num=7),但实际并非如此。

我无法通过统一修改class的因子顺序来解决,因为class在不同manufacturer分组中的排序逻辑不同。我希望所有条形的顺序完全匹配mpg_ordered的行顺序:

> mpg_ordered
# A tibble: 32 x 3
# Groups:   manufacturer [15]
   manufacturer class        num
   <fct>        <chr>      <int>
 1 nissan       compact        2
 2 nissan       suv            4
 3 nissan       midsize        7
 4 audi         midsize        3
 5 audi         compact       15
 6 lincoln      suv            3
 7 land rover   suv            4
 8 mercury      suv            4
 9 subaru       compact        4
10 subaru       subcompact     4
# i 22 more rows
# i Use `print(n = ...)` to see more rows

期望的图表效果是每个manufacturer分组内的条形按对应num升序排列,即每个分组内数值小的条形在前、数值大的在后,整体x轴分组按各自最小num值升序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:22:35