#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()
Теперь предположим, что у меня на самом деле есть 100 имен, поэтому я хочу разделить это на два графика, в каждом из которых по 50 имен.
Я могу попробовать огранку, но каждая грань по-прежнему имеет все имена.
df <- df %>% mutate(panel = floor((row_number()-1)/2))
ggplot(df, aes(name, x)) geom_point() coord_flip()
facet_wrap(~panel)
Я могу написать цикл для создания нескольких графиков, а затем склеить их позже в документе:
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 Делаем сейчас!