Различный порядок во внутренних элементах ggplot2 facet_grid с несколькими повторяющимися значениями - PullRequest
2 голосов
/ 08 марта 2019

Это может быть очень частный случай, который я пытался выполнить, но тем не менее весьма полезный.Мне нужно отсортировать внутренние элементы 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, результатом должны быть C, Z, A для сетки FALSE и A, C, Z для сетки TRUE.Должна быть функция ungroup() для переупорядочения ggplot2 ...

БОНУС: Еще сложнее, у меня есть дружественная к тидивусу функция в библиотеке lares для расчета и построения частот (freqs).Он использует ленивую оценку !!!variables для каждой переменной, и иногда этих переменных может быть больше одной.Например, distr(df, var1, var2, var3) или просто distr(df, var1).Вот почему я не могу (или, по крайней мере, не знаю, как) динамически преобразовать эти переменные в отсортированные факторы, если это решение.

Есть ли способ сделать это без использования * 1032?* или gridExtra, который создает разные графики, а затем склеивает их все вместе?Это слишком медленно ...

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Это работает для вас? Подробнее здесь

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()) 

Создано в 2019-03-08 пакетом Представление (v0.2.1.9000)

1 голос
/ 08 марта 2019

Это насколько я могу решить это.

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()

...