【问题标题】:ggplot2 & gridExtra: Reduce space between plots, but keep ylab of one plotggplot2 & gridExtra:减少地块之间的空间,但保留一个地块的 ylab
【发布时间】:2018-08-09 03:46:54
【问题描述】:

我想通过 ggplot2 和 gridExtra 包并排绘制 3 个图形。左边的图形有一个ylab,其他2个图形没有。所有三个图形应具有相同的大小,并且应尽可能减少图形之间的空间。但是,由于左侧图形的 ylab ,我要么无法根据需要减少空间;或者我正在切断 ylab。

考虑 R 中的以下示例:

library("ggplot2")
library("gridExtra")

# Example data
df <- data.frame(x = 1:10,
                 y = 1:10)

# Plots
ggp1 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("Here is the ylab")

ggp2 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("")

ggp3 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("")

# Arrange grids
grid.arrange(ggp1, ggp2, ggp3, ncol = 3)

  • 应尽可能减少图形之间的间距。
  • 所有图形都应具有相同的大小。
  • 应保留左侧图形的ylab。

我试图解决 plot.margin 的问题,但很遗憾,这不起作用。

【问题讨论】:

  • 如果您不介意从gridExtra 切换到cowplot,请查看cowplotvignette 制作这些标签
  • 几个快速替换:您可以使用egg::ggarrange 来获得相同的面板尺寸,或者您可以隐藏所有y 轴标题,然后使用grid.arrangeleft 参数,或使用facets
  • 所以对于备选方案 2.,从 here 获得提示:plst &lt;- lapply(list(ggp1, ggp2, ggp3), "+", theme(axis.title.y = element_blank(), plot.margin = unit(c(1,0,1,0), "lines"))) ; grid.arrange(grobs = plst, left="my y-axis title", ncol=3)
  • 非常感谢所有 cmets!我使用了 user10199750 的解决方案,因为他的解决方案完美地解决了我的问题。不过,很高兴知道还有更多选择。

标签: r ggplot2 plot whitespace


【解决方案1】:

我建议 cbind() gtables,移除轴。空单位自动确保面板宽度相等。

lg <- lapply(list(ggp1,ggp2,ggp3),ggplotGrob)

rm_axis <- function(g){
  lay <- g[["layout"]]
  cp <- lay[lay$name == "panel",]
  g[,-c(1:(cp$l-1))]
}

lg[-1] <- lapply(lg[-1], rm_axis)

grid::grid.draw(do.call(gtable_cbind, lg))

【讨论】:

  • 非常好的解决方案。
【解决方案2】:

theme (axis.title.y = element_blank()) 添加到ggp2ggp3 将减少它们之间的空间。

library("ggplot2")
library("gridExtra")

# Example data
df <- data.frame(x = 1:10,
                 y = 1:10)

# Plots
ggp1 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("Here is the ylab")

ggp2 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("") + theme (axis.title.y = element_blank())


ggp3 <- ggplot(df, aes(x, y)) + 
  geom_line() + theme_bw() +
  ylab("") + theme (axis.title.y = element_blank())

# Arrange grids
grid.arrange(ggp1, ggp2, ggp3, ncol = 3)

【讨论】:

  • 感谢您的回复。不幸的是,您的解决方案创建了不同大小的图(左侧的图比其他两个窄)。
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多