ggplot2的facet_grid内部元素具有多个重复值的不同重排序

时间:2019-03-08 12:46:55

标签: r sorting ggplot2 facet-grid

这可能是我一直试图完成的一个非常特殊的案例,但是仍然非常有用。我需要基于另一个变量使用多个重复的值对ggplot2的facet_grid内部元素进行排序。给定data.frame df的示例(如下所示)。使用factor时,您可以为其级别定义特定的顺序,但是在这种情况下,存在不同的顺序,因为它基于第三个值,在本示例中,对于var2 = TRUE的网格, A将是第一个(排名)元素,对于var2 = FALSE的网格,A应该是最后一个元素。

df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
                 var2 = c('C','A','A','Z','C'),
                 n = c(5,10,1,3,3))
ggplot(df, aes(reorder(var2,n), n)) + 
  geom_col() + facet_grid(var1~.) + coord_flip()

example ggplot2

我希望按n变量对两个网格进行排序,对于FALSE网格,结果应为C,Z,A,对于TRUE网格,结果应为A,C,Z。应该有一个ungroup()函数来ggplot2的重新排序...

奖金:更复杂的是,我在lares library中有一个tidyverse友好函数,用于计算和绘制频率(freqs)。它对每个变量使用!!!variables惰性计算,有时这些变量可能不止一个。例如,distr(df, var1, var2, var3)或简单地distr(df, var1)。这就是为什么我不能(或者至少我不知道如何)将这些变量动态地转换为排序因子(如果可以的话)。

有没有一种方法可以不使用cowplotgridExtra来制作不同的图,然后将它们全部粘贴在一起?太慢了...

2 个答案:

答案 0 :(得分:2)

这对您有用吗?查看更多here

library(tidyverse)

df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
                 var2 = c('C','A','A','Z','C'),
                 n = c(5,10,1,3,3))

reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
  new_x <- paste(x, within, sep = sep)
  stats::reorder(new_x, by, FUN = fun)
}

scale_x_reordered <- function(..., sep = "___") {
  reg <- paste0(sep, ".+$")
  ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}

ggplot(df, aes(reorder_within(var2, n, var1), n)) +
  geom_col() +
  scale_x_reordered() +
  facet_grid(var1 ~ ., scales = "free", space = "free") +
  coord_flip() +
  theme_minimal() +
  theme(panel.grid.major.y = element_blank()) 

reprex package(v0.2.1.9000)于2019-03-08创建

答案 1 :(得分:1)

这是我所能解决的。

library(ggplot2)
df <- data.frame(var1 = c(TRUE, TRUE, FALSE, FALSE, FALSE),
                 var2 = as.factor(c('C','A','A','Z','C')),
                 n = c(5, 10, 1, 3, 3))
df$var3 <- ifelse(df$var1, paste0(df$var2, 'T'), paste0(df$var2, 'F'))

ggplot(df, aes(x = reorder(var3, n), 
               y = n)) + 
  geom_col() + 
  facet_grid(var1 ~ ., scales = "free", space = "free") +
  coord_flip()