我制作了一个包含两个因素的条形图,一个位于 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')
这不是我想要的。
manufacturer
级别按预期排序,但不是每个 class
级别内的 manufacturer
级别。例如,在第一个 manufacturer
级别 nissan 中,顺序应为 compact、suv 和 midsize。当然,我可以更改填充颜色变量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
因此,我期望的情节的顺序类似于上面链接的问题(这个问题):
(但那里提供的答案似乎不起作用)
实现所需结果的一个选项是创建一个辅助列作为
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")