Переупорядочить графики 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
если вы хотите обратить вспять уровни факторов.