使用带有facet_wrap的ggplot2在R中显示多个轴标签

JD *_*ong 10 r ggplot2 facet-wrap

我用ggplo2创建了一个很好的facet_wrap密度图.我希望每个面板都有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
Run Code Online (Sandbox Code Playgroud)

哪个回报:

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/10/3stooges.png

看起来这应该很简单,但我的Google Fu太穷了,无法找到答案.

小智 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
Run Code Online (Sandbox Code Playgroud)


Har*_*lan 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))
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要发布质量的图像,您可能尝试的另一件事是使用ggsave()将图形保存为PDF或SVG(如果您不在Windows上)格式,然后使用类似Inkscape的内容编辑生成的图像.您可以轻松地将底部图像向下移动并将轴复制到... (2认同)