Отображение меток нескольких осей с использованием ggplot2 с facet_wrap в R
-
20-09-2019 - |
Вопрос
У меня есть хороший график плотности facet_wrap, который я создал с помощью ggplot2
.Я бы хотел, чтобы на каждой панели были метки по осям x и y вместо того, чтобы иметь только метки по оси y вдоль левой стороны и метки x внизу.То, что у меня есть прямо сейчас, выглядит примерно так:
library(ggplot2)
myGroups <- sample(c("Mo", "Larry", "Curly"), 100, replace=T)
myValues <- rnorm(300)
df <- data.frame(myGroups, myValues)
p <- ggplot(df) +
geom_density(aes(myValues), fill = alpha("#335785", .6)) +
facet_wrap(~ myGroups)
p
Который возвращает:
(источник: cerebralmastication.com)
Кажется, что это должно быть просто, но мой Google Fu был слишком беден, чтобы найти ответ.
Решение
Вы можете сделать это, включив опцию scales="free" в свой вызов facet_wrap:
myGroups <- sample(c("Mo", "Larry", "Curly"), 100, replace=T)
myValues <- rnorm(300)
df <- data.frame(myGroups, myValues)
p <- ggplot(df) +
geom_density(aes(myValues), fill = alpha("#335785", .6)) +
facet_wrap(~ myGroups, scales="free")
p
Другие советы
Короткий ответ:Ты не можешь этого сделать.Это могло бы иметь смысл с 3 графами, но что, если бы у вас была большая решетка из 32 графиков?Это выглядело бы шумно и плохо.Философия GGplot заключается в том, чтобы делать правильные вещи с минимумом настроек, что, естественно, означает, что вы не можете настраивать вещи так сильно, как другие пакеты.
Длинный ответ:Вы могли бы подделать это, создав три отдельных объекта ggplot и объединив их.Но это не очень общее решение.Вот некоторый код из книги Хэдли, который предполагает, что вы создали объекты ggplot a, b и c.Он помещает a в верхний ряд, а b и c - в нижний ряд.
grid.newpage()
pushViewport(viewport(layout=grid.layout(2,2)))
vplayout<-function(x,y)
viewport(layout.pos.row=x,layout.pos.col=y)
print(a,vp=vplayout(1,1:2))
print(b,vp=vplayout(2,1))
print(c,vp=vplayout(2,2))