cowplot:如何通过修改轴限制来自定义主面板和边缘图之间的间隙?

cowplot: How to customize the gaps between main panel & marginal plots by modifying axis limits?

这是@ClausWilke () 提供的解决方案之一的后续问题,用于在主面板和边际图之间插入间隙。 如何决定 (scale_x_continuous) 的限制? 另外,如果我们使用“NA”作为上限会怎样?

# Example with limits set to: (-2,4.5)
require(ggplot2)
require(cowplot)

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy)) + 
  geom_point() + 
  xlab("City driving (miles/gallon)") +
  ylab("Highway driving (miles/gallon)") + 
  theme_grey()

xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = 1))  + 
  scale_x_continuous(limits = c(-2, 4.5)) + coord_flip()

ybox2 <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = 1)) + 
  scale_x_continuous(limits = c(-2, 4.5))

p1 <- insert_xaxis_grob(pmain, xbox2, grid::unit(0.8, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox2, grid::unit(0.8, "in"), position = "right")

ggdraw(p2)

有了连续的x轴刻度,您可以使用expand_limits在主图和边缘图之间添加一些空白space。

例如,您的 ybox2 是一个具有连续 x 轴刻度的单箱线图。默认情况下,此图的 x 范围大约为 0.6 到 1.4(您可以通过 运行 ggplot(mpg, aes(y=hwy, x=1)) + geom_boxplot() 看到这一点)。以下代码将 x 轴下限设置为 0.2,这意味着大约 0.4/(0.8+0.4) = 33% 的 x 轴范围将是主图和边际图之间的边距。我们对 xbox2.

做同样的事情
ybox2 <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = 1)) +
  expand_limits(x = 0.2)

xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = 1))  + 
  coord_flip() +
  expand_limits(x = 0.2)

p1 <- insert_xaxis_grob(pmain, xbox2, grid::unit(0.4, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox2, grid::unit(0.4, "in"), position = "right")

ggdraw(p2)

接受的答案是正确的。提供一些额外信息:

首先,您可以使用 layer_scales() 函数来准确计算绘图的比例限制。例如:

ybox2 <- axis_canvas(pmain, axis = "y") +  
    geom_boxplot(data = mpg, aes(y = hwy, x = 1))
layer_scales(ybox2)
#$x
#<ScaleContinuousPosition>
# Range:  0.625 -- 1.38
# Limits: 0.625 -- 1.38
#
#$y
#<ScaleContinuousPosition>
# Range:    12 --   44
# Limits: 10.4 -- 45.6

其次,查看显示轴的主题中的边缘图可能会有所帮助,如下所示:

ybox2 + theme_bw()

我们看到箱线图完全填满了绘图的整个 x 范围,因此没有边距。如果我们按照其他答案中的建议展开轴,我们会得到:

ybox2 + expand_limits(x = 0.2) + theme_bw()

在我制作的原始图中,有四个箱线图,使用这些方法可以看到箱线图位于位置 1、2、3、4,因此将轴范围设置为 -2 到4.5.然而,4.5 的上限并没有完美地选择,并且在箱线图的另一侧产生了一些额外的差距。 expand_limits() 方法可能更好。