Переупорядочить графики facet_wrap на основе точек на вспомогательном участке

Я хотел бы изменить facet_wrap сюжеты в лучшую сторону.

library(ggplot2)

set.seed(123)
freq <- sample(1:10, 20, replace = T)
labels <- sample(LETTERS, 20)
value <- paste("i",1:13,sep='')

lab <- rep(unlist(lapply(1:length(freq), function(x) rep(labels[x],freq[x]))),2)
ival <- rep(unlist(lapply(1:length(freq), function(x) value[1:freq[x]])),2)

df <- data.frame(lab, ival, type=c(rep('Type1',119),rep('Type2',119)),val=runif(238,0,1))


ggplot(df, aes(x=ival, y=val, col = type, group = type)) + 
    geom_line() + 
    geom_point(aes(x=ival, y=val)) +
    facet_wrap( ~lab, ncol=3) + 
    theme(axis.text.x=element_text(angle=45, vjust=0.3)) + 
    scale_x_discrete(limits=paste('i',1:13,sep=''))

Это приводит к следующему графику:

Есть ли способ переставить графики на основе их частоты? Некоторые из lab частоты (или количество точек на тип) очень низкие (1-3). Я хотел бы организовать участки facet_wrap по их частотам вместо их меток. Одним из преимуществ является уменьшение площади заговора и получение лучшей интуиции от заговоров.

Можно ли это сделать, используя значения частоты, вычисленные на лету, и передать их facet_wrap? Или это должно быть сделано отдельно, используя dplyr подходы и разделить данные на участки с низким / средним / высоким частым?

1 ответ

Вот одна идея. Мы можем использовать dplyr рассчитать количество каждой группы в lab и использовать fct_reorder от forcats переупорядочить уровень фактора.

library(dplyr)
library(forcats)

df2 <- df %>%
  group_by(lab) %>%
  mutate(N = n()) %>%
  ungroup() %>%
  mutate(lab = fct_reorder(lab, N))

ggplot(df2, aes(x=ival, y=val, col = type, group = type)) + 
  geom_line() + 
  geom_point(aes(x=ival, y=val)) +
  facet_wrap( ~lab, ncol=3) + 
  theme(axis.text.x=element_text(angle=45, vjust=0.3)) + 
  scale_x_discrete(limits=paste('i',1:13,sep=''))

Задавать .desc = TRUE когда используешь fct_reorder если вы хотите обратить вспять уровни факторов.

Другие вопросы по тегам