如何在条形图中按每个 x 因子级别的升序排列填充变量?

问题描述 投票:0回答:1

我制作了一个包含两个因素的条形图,一个位于 x 轴,另一个确定条形的填充颜色。我希望成为每个 x 因子级别内从左到右升序的条形。此外,我还希望根据每个 x 因子级别的最小 y 组,将 x 级别升序排序。我发现了一个类似的问题并尝试了这个:

library(ggplot2)
library(tidyverse)

# Finding the right x levels order.
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
# Finding the right y order in each x level.
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)
# Plot.
mpg_ordered %>%
  ggplot(., aes(x= manufacturer, y= num, fill= class)) +
  geom_bar(stat= "identity", position = "dodge", color='black')

Plot

这不是我想要的。

manufacturer
级别按预期排序,但不是每个
class
级别内的
manufacturer
级别。例如,在第一个
manufacturer
级别 nissan 中,顺序应为 compactsuvmidsize。当然,我可以更改填充颜色变量
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

因此,我期望的情节的顺序类似于上面链接的问题(这个问题):

Like this

(但那里提供的答案似乎不起作用)

r ggplot2 geom-bar
1个回答
0
投票

实现所需结果的一个选项是创建一个辅助列作为

interaction
x
变量的
fill
,然后可以将其映射到
group
aes:

library(tidyverse)

mpg |>
  count(manufacturer, class, name = "num") |>
  # Create a helper column to set the order
  arrange(manufacturer, num) |>
  mutate(
    class_ordered = interaction(manufacturer, class),
    class_ordered = fct_inorder(class_ordered)
  ) |>
  ggplot(aes(
    x = manufacturer, y = num, fill = class,
    group = class_ordered
  )) +
  geom_col(position = "dodge", color = "black")

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.