Отображение меток нескольких осей с использованием ggplot2 с facet_wrap в R

StackOverflow https://stackoverflow.com/questions/1532535

  •  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

Который возвращает:

alt text
(источник: 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

enter image description here

Другие советы

Короткий ответ:Ты не можешь этого сделать.Это могло бы иметь смысл с 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top