使用分面 ggplot,并将 Y 轴置于中间

3
假设我有两个由下面的R代码生成的并排的图,它们具有相同的y轴:
df <- data.frame(x=c(5,2,7,3), y=c(11,3,5,6), facet=c(1,1,2,2))
ggplot(df, aes(x, y)) + facet_grid(~facet) + geom_point()

图表

是否可以将y轴上的文字(例如10.0、7.5、5.0)写在两个图表中间?(最好能居中对齐)

1个回答

4

这里有一种方法(几乎)使用Baptiste在Stack Overflow帖子“在facet时显示每个subplot的y轴”中的答案。不完全在中间,但很接近。

library(ggplot2)
library(gtable)

# your data
df <- data.frame(x=c(5,2,7,3), y=c(11,3,5,6), facet=c(1,1,2,2))

# First plot (a bit of extra space between facets)
p <- ggplot(df, aes(x, y)) + facet_grid(~facet) + 
        geom_point() + 
        theme(panel.margin = unit(1, "lines"),
              axis.text.y  = element_text( hjust=0))

# get y-axis labels 
g <- ggplotGrob(p)
axis <- gtable_filter(g, "axis-l")[["grobs"]][[1]][["children"]][["axis"]][,1]

# remove axis
g[["grobs"]][[4]][["children"]][["axis"]] <- NULL

# build plot & add axis to LHS of left facet
panels <- subset(g$layout, name == "panel")
g <- gtable_add_grob(g, grobs=axis, t = unique(panels$t), l=tail(panels$l, -1)-1)

grid.newpage()
grid.draw(g)

enter image description here


hjust=0 替换为 hjust=0.5 可以使文本居中。另外,虽然原问题中没有提到,但是否可以通过 ggsave 实现呢?目前,如果我使用 ggsave(p, file="p.pdf"),轴标签就不会被绘制出来。 - rodrigorgs
1
@rodrigorgs; 你需要保存 g 而不是 p。你需要一个解决方法,因为 ggsave 期望一个 ggplot(而不是一个 gtable 对象)。使用来自这里 [https://dev59.com/_WMl5IYBdhLWcg3wbGh1] 的 Baptiste 解决方案,即 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2],然后可以使用 ggsave(grid.draw(g), file="p.pdf") 生成图表。 - user20650
@rodrigorgs;或者使用pdf——这是我使用的(记得grid.draw(g))。 - user20650
太好了!我注意到它可以使用 pdf(...)dev.off(),但在这种情况下我更喜欢使用 ggsave(...) - rodrigorgs
@rodrigorgs;太棒了(真的感谢Baptiste的帖子);) - user20650

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接