cowplot:如何定制主面板和主板之间的差距边界图通过修改轴限制?

时间:2017-11-29 05:57:20

标签: r ggplot2 cowplot

这是关于@ClausWilke(see post)提供的一个解决方案的后续问题,以便在主要面板和边缘情节。 如何确定(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)

2 个答案:

答案 0 :(得分:3)

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

例如,您的ybox2是一个带有连续x轴刻度的单一框图。默认情况下,此图的x范围大致为0.6到1.4(您可以通过运行ggplot(mpg, aes(y=hwy, x=1)) + geom_boxplot()来查看)。以下代码将较低的x轴限制设置为0.2,这意味着x轴范围的约0.4 /(0.8 + 0.4)= 33%将是主图和边缘图之间的边距。我们对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)

enter image description here

答案 1 :(得分:2)

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

首先,您可以使用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()

enter image description here

我们看到箱线图完全填满了图表的整个x范围,因此没有边距。如果我们扩展轴,如另一个答案所示,我们得到:

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

enter image description here

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