【问题标题】:R / Tidyverse: Ordering factors within group with duplicate labels and plotting using facet_wrapR / Tidyverse:使用重复标签对组内的因子进行排序并使用 facet_wrap 进行绘图
【发布时间】:2021-03-04 21:13:37
【问题描述】:

我正在尝试使用 ggplot 绘制一个图,其中我在一个变量上刻面,并制作两个图(每个变量一个,显示类别 (y) 的值 (x),其中 y 以降序绘制相对于到每个组内的 X。这里的问题是,在每个组中,存在相同的 y 标签,这似乎弄乱了因子水平。

设置数据:

dummy_data <- tibble(
  
  y_var = c('v1', 'v2', 'v3', 'v4', 'v5', 'v2', 'v6', 'v7', 'v4', 'v7'),
  x_var = c(0.0629, 0.0631, 0.0654, 0.0657, 0.0676, 0.0693, 0.0707, 0.0728, 0.0733, 0.0868),
  group_var = c("A", "B", "B", "A", "B", "A", "A", "A", "B", "B")
  
) %>% 
  group_by(group_var) %>% # group by the grouping variable
  arrange(x_var, .by_group = TRUE) %>% # arrange the rows by x_var, within each group
  mutate(y_var = factor(y_var, levels = y_var)) # change the y variable to a factor to retain order when plotting

dummy_data %>%
  ggplot() +
  geom_point(aes(x = x_var, y = y_var, color = group_var), size = 5) +
  facet_wrap(~group_var, scales = 'free', dir = 'v')

如下所示的输出未按需要排序。

这可以通过使所有 y_var 值唯一(将组名添加到值)来纠正,但是这是不可取的,因为这会改变 y 轴标签(如下所示)

dummy_data %>%
  mutate(y_var = str_c(y_var, group_var),
         y_var = factor(y_var, levels = y_var)) %>%
  ggplot() +
  geom_point(aes(x = x_var, y = y_var, color = group_var), size = 5) +
  facet_wrap(~group_var, scales = 'free', dir = 'v')

我想生成第二张图,而不必更改所有y_var 的值。谢谢!

【问题讨论】:

  • 如果 B 组的因子值在 A 组中不存在,会发生什么情况?例如,A 组不存在 V3 和 V5,那么 B 组应该在哪里显示它们?

标签: r ggplot2 dplyr tidyverse


【解决方案1】:

tidytext::reorder_within() 做了类似的事情,结合tidytext::scale_y_reordered() 有助于整理输出,使其看起来像你的目标。

library(tidytext)

dummy_data %>%
  mutate(y_var = reorder_within(y_var,  x_var, group_var)) %>%
  ggplot() +
  geom_point(aes(x = x_var, y = y_var, color = group_var), size = 5) +
  scale_y_reordered() +
  facet_wrap(~group_var, scales = 'free', dir = 'v')

【讨论】:

  • 正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2021-11-04
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多