Простой способ разбить график на панели в ggplot?

#r #ggplot2

#r #ggplot2

Вопрос:

Предположим, у меня есть такой пример:

 df <- data.frame(name=c('aaa', 'bbb', 'ccc', 'ddd'), x = c(1,2,3,4))
ggplot(df, aes(name, x))   geom_point()   coord_flip()
 

сюжет 1

Теперь предположим, что у меня на самом деле есть 100 имен, поэтому я хочу разделить это на два графика, в каждом из которых по 50 имен.

Я могу попробовать огранку, но каждая грань по-прежнему имеет все имена.

 df <- df %>% mutate(panel = floor((row_number()-1)/2))

ggplot(df, aes(name, x))   geom_point()   coord_flip()  
  facet_wrap(~panel)
 

участок 2

Я могу написать цикл для создания нескольких графиков, а затем склеить их позже в документе:

 plots <- list()
for (idx in 1:2) {
  plots[[idx]] <- ggplot(df %>% filter(panel == (idx-1)),
                       aes(name, x))   geom_point()   coord_flip()
}
 

Однако есть ли более простой способ отобразить две панели, каждая из которых имеет только свои собственные имена?
Например, может facet_wrap быть (или что-то еще) удалит имена без каких-либо данных?

Ответ №1:

Короткий ответ:

Использовать facet_wrap(~panel, scales="free_y") . Это приведет к удалению точек без значения y.

Более простой пример:

Может быть, вы ищете это. Вы можете использовать cut() и quantile() для определения, в некотором смысле, точки разреза в ключевом фрейме данных, который содержит уникальные имена и индекс i , чтобы разделить данные на две группы по желанию. Здесь я добавил фиктивные данные с 50 строками и разными группами, чтобы посмотреть, как это работает (обновлено большое спасибо @dfrankow за совет):

 library(ggplot2)
#Data
df <- data.frame(name=sample(c('aaa', 'bbb', 'ccc',
                               'ddd','eee','fff',
                               'ggg','hhh','iii','jjj'),50,replace = T), x = c(1:50))
#Create unique names
keys <- data.frame(name=unique(df$name))
keys$i <- 1:nrow(keys)
keys$panel <- cut(keys$i,breaks = c(-Inf,quantile(keys$i,0.5),Inf),include.lowest = T,right = T,
                labels = c('G1','G2'))
#Add group
df$panel <- keys[match(df$name,keys$name),"panel"]
#Plot
ggplot(df, aes(name, x))   geom_point()   coord_flip()  
  facet_wrap(~panel,scales = 'free_y')
 

Вывод:

введите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ. Боюсь, это не то, чего я хочу. Вы сокращаете значения, но я хочу разделить «имена» на две панели, которые не имеют общих имен.

2. @dfrankow Теперь все ясно. Позвольте мне набросать решение для этого!

3. @dfrankow Я обновил решение. Не могли бы вы проверить, работает ли это для вас?

4. Ах, спасибо! Я думаю, что ответ (внутри вашего ответа) таков: «Использовать facet_wrap(~panel, scales="free_y") . Это приведет к удалению точек без y «. Если вы отправите это в качестве ответа, я приму.

5. @dfrankow Делаем сейчас!