10

我有一个很好的 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

返回:

替代文字
(来源:脑咀嚼网

看起来这应该很简单,但我的谷歌福已经太穷了,找不到答案。

4

2 回答 2

13

您可以通过在 facet_wrap 调用中包含 scales="free" 选项来做到这一点:

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

在此处输入图像描述

于 2011-05-19T05:26:00.717 回答
8

简短的回答:你不能那样做。使用 3 个图可能有意义,但如果你有一个由 32 个图组成的大格子呢?那会看起来很吵而且很糟糕。GGplot 的理念是用最少的定制做正确的事,这自然意味着你不能像其他包那样定制东西。

长答案:您可以通过构建三个单独的 ggplot 对象并将它们组合来伪造它。但这不是一个非常普遍的解决方案。这是 Hadley 书中的一些代码,假设您已经创建了 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))
于 2009-10-07T16:16:29.560 回答