R ggplot2 facet wrap点图重新排序每个

R ggplot2 facet wrap dot plot reorder each

我使用 public mtcars 数据集得到了下图。我先转换成tibble,把汽车信息留成我可以用的栏目。

mtcars <- as_tibble(mtcars, rownames = 'car')

ggplot(mtcars, aes(x = mpg, y = reorder(car, mpg))) +
  geom_point()

你可以看到我根据 mpg 的值重新排序了 y 轴的汽车。

我也有一个长数据框:

mtcars_numeric <- mtcars %>%
  dplyr::select(car, mpg, disp, hp, drat, wt, qsec) 

mtcars_long_numeric_with_mpg <- pivot_longer(mtcars_numeric, names_to = 'names', values_to = 'values', 2:7)

ggplot(mtcars_long_numeric_with_mpg, aes(x = values, y = reorder(car, values))) +
  geom_point() + facet_wrap(~names, scales = 'free_x')+
theme(text = element_text(size=6))

当所有方面都不同时,如何将每辆车按价值排序?我希望重新排列 y 轴标签,使每个小平面的曲线与第一张图相似。

这可以通过 tidytext 包中的 reorder_within + scale_y_reordered 实现,如下所示:

  1. 通过 reorder_within
  2. 根据构面内的值重新排序 y 轴变量
  3. 使用scale_y_reordered
  4. 也为您的 y 轴自由设置刻度。
library(ggplot2)
library(dplyr)
library(tidyr)
library(tidytext)

mtcars2 <- as_tibble(mtcars, rownames = 'car')

mtcars_long_numeric_with_mpg <- mtcars2 %>%
  select(car, mpg, disp, hp, drat, wt, qsec) %>% 
  pivot_longer(names_to = 'names', values_to = 'values', 2:7) %>% 
  mutate(car = tidytext::reorder_within(car, values, names))

ggplot(mtcars_long_numeric_with_mpg, aes(x = values, y = reorder(car, values))) +
  geom_point() + 
  tidytext::scale_y_reordered() +
  facet_wrap(~names, scales = 'free')+
  theme(text = element_text(size=6))