使用 cowplot 时减少绘图之间的边距
Posted
技术标签:
【中文标题】使用 cowplot 时减少绘图之间的边距【英文标题】:Decrease margins between plots when using cowplot 【发布时间】:2017-06-09 14:24:42 【问题描述】:我想使用cowplot 将一些图表组合在一起。但我无法更改边距大小。我只想使用一个 y 轴,但余量仍然很大,我想减少。我使用了 ggplot 中的 plot.margin 代码,虽然当我查看单个图时它有效,但当图合并时它似乎不起作用。
我已经做了一些示例代码:
library(ggplot2)
library(cowplot)
x <- c("a", "b")
y1 <- c(3,6)
y2 <- c(10,15)
data1 <- data.frame(x,y1)
data2 <- data.frame(x, y2)
ylab1 <- ylab("Very nice y values")
xlab1 <- xlab("Very nice factors")
plot1 <- ggplot(data1, aes(x=x, y = y1)) +
geom_bar(stat ="identity", position=position_dodge(), fill = "grey")+
theme(plot.margin = unit(c(0.5,0.5,0.5,0.5), "cm")) + xlab1 + ylab1
plot1
ylab2 <- ylab("")
xlab2 <- xlab("Very nice factors")
plot2 <- ggplot(data2, aes(x=x, y = y2)) +
geom_bar(stat = "identity",position=position_dodge(), fill = "grey")+
theme(plot.margin = unit(c(0.5,0.5,0.5,-0.5), "cm")) + xlab2 + ylab2
plot2
plot3 <- plot_grid(plot1, plot2, labels = c("A", "B"), align = "hv",nrow = 1, ncol = 2)
plot3 # Quite large margin between the two plots
我知道我可以通过使用构面来避免这个问题,但是我的真实情节比这张图要复杂得多。
【问题讨论】:
【参考方案1】:在plot_grid
中增加地块之间的空间也已解决in this issue。
一个更有趣的解决方案是建议的in this comment - 尝试在两个图之间添加一个额外的空图并调整相对列宽:
plot4 <- plot_grid(plot1, NULL, plot2, rel_widths = c(1, 0, 1), align = "hv",
labels = c("A", "B"), nrow = 1)
plot4
甚至可以在rel_widths
中尝试负值,这样会得到更好的结果:
plot5 <- plot_grid(plot1, NULL, plot2, rel_widths = c(1, -0.1, 1), align = "hv",
labels = c("A", "B"), nrow = 1)
plot5
因此,尝试调整plot.margin
(由@J.Con 回答)和通过调整rel_widths
添加额外的空白图。
编辑 2019-12-11
还可以查看cowplot
(克劳斯·威尔克)作者的this comment:
对于这些类型的问题,我现在推荐
patchwork
库。由于其底层设计,plot_grid()
本身就很困难
因此,patchwork
基于他们的小插图 Adding Annotation and Style 的快速示例如下所示:
library(patchwork)
plot3 <- plot1 + plot2 +
plot_annotation(tag_levels = 'A') &
theme(plot.tag = element_text(size = 8))
plot3
由reprex package (v0.3.0) 于 2019 年 12 月 11 日创建
【讨论】:
哦,我有点忘了我曾经问过这个问题......所以我也自己想出来了,它和这个答案很相似。我认为 align 函数没有考虑更改的绘图边距。我通常会减小其中一张图的相对宽度。您的解决方案听起来要简单得多,我会尽快尝试。谢谢。 是的,我认为可以将绘图边距调整到某个点,超过该点来自plot_grid
的对齐选项不再考虑它们。
感谢您的更新,拼凑包确实会考虑利润。【参考方案2】:
您的plot.margin
s 实际上对您不利。将它们设置为零以填充该空白区域。
plot1 <- ggplot(data1, aes(x=x, y = y1)) +
geom_bar(stat ="identity", position=position_dodge(), fill = "grey")+
theme(plot.margin = unit(c(0,0,0,0), "cm")) + xlab1 + ylab1
plot1
ylab2 <- ylab("")
xlab2 <- xlab("Very nice factors")
plot2 <- ggplot(data2, aes(x=x, y = y2)) +
geom_bar(stat = "identity",position=position_dodge(), fill = "grey")+
theme(plot.margin = unit(c(0,0,0,0), "cm")) + xlab2 + ylab2
plot2
plot3 <- plot_grid(plot1, plot2, labels = c("A", "B"), align = "hv",nrow = 1, ncol = 2)
plot3
【讨论】:
以上是关于使用 cowplot 时减少绘图之间的边距的主要内容,如果未能解决你的问题,请参考以下文章
在 Bootstrap 3 之间添加交互元素时如何修复多个收音机之间的边距?
Swift:UITableViewController - 修改 UITableView 和 View Controller 之间的边距