这是我的例子:
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轴重新排序。
要单独重新排序分面,您可以(必须)使用辅助列,即
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")