在facet_wrap、ggplot2中按y轴重新排序x轴

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

这是我的例子:

set.seed(1)
x <- replicate(n = 5, 'left')
y <- replicate(n = 5, 'right')
dir <- c(x,y)
quantity <- sample(seq(1,100), 10)
names <- rep(letters[1:5],2)
tb <- tibble(dir,quantity,names) %>%
  group_by(dir) %>%
  arrange(desc(quantity))

tb %>%
  ggplot(aes(x = fct_inorder(names), quantity)) +
    geom_bar(stat = 'identity', color = 'black') +
  coord_flip() +
  facet_wrap(~dir, scales = "free")

我想要的是让左侧和右侧都按数量降序对x轴重新排序。

r ggplot2 facet-wrap
1个回答
0
投票

要单独重新排序分面,您可以(必须)使用辅助列,即

y
轴变量和分面变量的交互。然后按照您想要的顺序重新排序数据(就像您已经做的那样),然后使用
fct_inorder
根据数据的顺序设置辅助列的顺序。最后,将辅助列映射到
y
上并清理标签,即删除与分面变量对应的标签部分。

注意:您还可以查看

tidytext
包,它提供了便利的功能
reorder_within
scale_x/y_reordered
,可以在后台使用相同的方法实现相同的结果。

library(tidyverse)

tb <- tibble(dir, quantity, names) %>%
  arrange(dir, desc(quantity)) |>
  mutate(
    y_ordered = paste(dir, names, sep = "."),
    y_ordered = fct_inorder(y_ordered)
  )

tb %>%
  ggplot(aes(quantity, y_ordered)) +
  geom_col(color = "black") +
  scale_y_discrete(
    # Clean up the axis labels
    labels = \(x) gsub("^.*?\\.", "", x)
  ) +
  facet_wrap(~dir, scales = "free_y")

© www.soinside.com 2019 - 2024. All rights reserved.