3

这是@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)
4

2 回答 2

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)

在此处输入图像描述

于 2017-11-29T08:27:42.947 回答
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()

在此处输入图像描述

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

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

在此处输入图像描述

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

于 2017-11-29T15:11:08.630 回答