这是关于@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)
答案 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)
答案 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()
我们看到箱线图完全填满了图表的整个x范围,因此没有边距。如果我们扩展轴,如另一个答案所示,我们得到:
ybox2 + expand_limits(x = 0.2) + theme_bw()
在我用原始图中制作的四个箱图中,使用这些方法可以看出箱形图位于1,2,3,4位置,因此将轴范围设置为-2到4.5是有意义的。但是,4.5的上限没有被完美地选择,并且在箱形图的另一侧产生了一些额外的间隙。 expand_limits()
方法可能更好。