在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙
Posted
技术标签:
【中文标题】在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙【英文标题】:Marginal plots using axis_canvas in cowplot: How to insert gap between main panel and marginal plots 【发布时间】:2018-05-12 13:48:58 【问题描述】:在this post:的评论中出现了以下内容在cowplot中使用axis_canvas()
函数制作边缘图时,我们如何在主图和边缘图之间创建间隙?
示例代码:
require(cowplot)
pmain <- ggplot(data = mpg, aes(x = cty, y = hwy, color = factor(cyl))) +
geom_point() +
xlab("City driving (miles/gallon)") +
ylab("Highway driving (miles/gallon)") +
theme_minimal()
xbox <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) +
geom_boxplot(data = mpg, aes(y = cty, x = factor(cyl), color = factor(cyl))) +
scale_x_discrete() + coord_flip()
ybox <- axis_canvas(pmain, axis = "y") +
geom_boxplot(data = mpg, aes(y = hwy, x = factor(cyl), color = factor(cyl))) +
scale_x_discrete()
p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right")
ggdraw(p2)
正如我们在这个例子中看到的,边缘箱线图直接接触到主绘图面板。目标是产生一些差距。如何做到这一点?
【问题讨论】:
【参考方案1】:我看到两个选项:
插入空白图
我们可以迭代地应用 insert_xaxis_grob()
/ insert_yaxis_grob()
函数来插入多个 grobs,其中一个可以为空。通过这种方式,我们可以在边缘图的任一侧插入指定数量的空间。在这里,我将展示如何在内部执行此操作,以在主面板和边缘图之间产生间隙:
# pmain, xbox, ybox are defined as in the question
pnull <- ggdraw() # generate empty plot
p1 <- insert_xaxis_grob(
insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top"),
pnull, grid::unit(0.2, "in"), position = "top")
p2 <- insert_yaxis_grob(
insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right"),
pnull, grid::unit(0.2, "in"), position = "right")
ggdraw(p2)
在边际图中创建间隙
另外,由于边缘图是用 ggplot2 绘制的,我们可以只指定在适当位置生成空间的轴限制。即,我们通过以下方式定义xbox2
和ybox2
,而不是原始代码中的xbox
和ybox
:
xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) +
geom_boxplot(data = mpg, aes(y = cty, x = as.numeric(factor(cyl)), color = factor(cyl))) +
scale_x_continuous(limits = c(-2, 4.5)) + coord_flip()
ybox2 <- axis_canvas(pmain, axis = "y") +
geom_boxplot(data = mpg, aes(y = hwy, x = as.numeric(factor(cyl)), color = factor(cyl))) +
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)
要了解这里发生了什么,让我们并排比较 xbox
和 xbox2
:
plot_grid(xbox + panel_border("black"),
xbox2 + panel_border("black"), nrow = 1, scale = 0.9)
我们看到xbox2
(右侧)在底部有额外的空间,这是通过将轴从 -2 开始创建的,即使第一个箱形图位于位置 1。有关如何选择的更多信息这些边缘图的轴范围可以在here.
【讨论】:
以上是关于在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙的主要内容,如果未能解决你的问题,请参考以下文章