在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签
Posted
技术标签:
【中文标题】在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签【英文标题】:Showing multiple axis labels using ggplot2 with facet_wrap in R 【发布时间】:2010-12-04 16:32:16 【问题描述】:我用ggplot2
创建了一个漂亮的 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
返回:
(来源:cerebralmastication.com)
看起来这应该很简单,但我的谷歌福已经太穷了,找不到答案。
【问题讨论】:
我认为您应该将接受的答案更改为以下由罗伯特提供的有效解决方案。 感谢@abalter 我就是这么做的。我没有注意到更好的答案 【参考方案1】:您可以通过在 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
【讨论】:
这应该是公认的答案,直接与@Harlan 的“简短答案”相矛盾。【参考方案2】:简短回答:你不能那样做。使用 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))
【讨论】:
是的,我从 ggplot 得到了“你不应该那样做”的感觉。我将尝试实施您提供的示例。这似乎是合理的。 如果您需要出版质量的图像,您可以尝试的另一件事是使用 ggsave() 将图形保存为 PDF 或 SVG(如果您不在 Windows 上)格式,然后编辑使用 Inkscape 之类的东西生成的图像。您可以轻松地将底部图像向下移动并向上复制轴...以上是关于在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签的主要内容,如果未能解决你的问题,请参考以下文章
从 selectInput 到 facet_wrap 的多个变量:R Shiny
使用 R 中 ggplot2 的 facet_wrap 功能对多个数据集进行箱线图比较?
在 R 中使用带有 ggplot 的 geom_line 时的锯齿形
R语言可视化包ggplot2包使用facet_wrap绘制多面板图(子图)实战