使用ggplot2和R中的镶嵌面_包裹显示多轴标签

使用ggplot2和R中的镶嵌面_包裹显示多轴标签,r,ggplot2,facet-wrap,R,Ggplot2,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, myValu

我用
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
库(ggplot2)

myGroups简短回答:你不能那样做。对于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))
grid.newpage()
推送视口(视口(布局=栅格布局(2,2)))

vplayout您可以通过在facet\u 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

myGroups是的,我从ggplot那里得到了“你不应该那样做”的感觉。我将尝试实现您给出的示例。这似乎是合理的。如果您需要出版物质量的图像,您可以尝试另一件事,即使用ggsave()将图形保存为PDF或SVG(如果您不在Windows上)格式,然后使用类似Inkscape的内容编辑生成的图像。您可以轻松地向下移动底部图像并向上复制轴…这应该是公认的答案,并且直接与@Harlan的“简短答案”相矛盾。我认为您应该将公认的答案更改为下面由robert提供的有效解决方案。谢谢@abalter我这样做了。我没有注意到更好的答案