首先,一些模拟图:
df <- data.frame(x = 1:10, y = 2:11)
由于我的真实图形相当复杂,因此我将不在此处提供它们,而是将使用其他图形重现该问题。可以说,在align
中将"hv"
设置为plot_grid
时,它在我的图之间创建了很多空白。为了解决这个问题,我在原始图中设置了边距,如下所示:
library(ggplot2)
plot1 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(-1, 0, 0, 0), "cm"))
哪个扩展了图的顶部,以便它们填充空白区域。一切都很好(在此示例中,顶部和底部之间可能有一点重叠):
library(cowplot)
plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2,
align = "hv")
plot5
直到我尝试添加标签。因为我已经扩展了图,所以我想添加高于y = 1
限制的标签。
plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2,
align = "hv", labels = c("A", "B", "C", "D"),
label_x = 0.1,
label_y = 1.15)+
theme(plot.margin = unit(c(3, 1, 1, 1), "cm"))
plot5
返回此警告:
Removed 1 rows containing missing values (geom_text).
这意味着即使有足够的空间,它也删除了两个顶部标签。因此,我想也许是在绘制标签之后才应用绘图边距,或者可能是裁切引起了问题。所以,我这样做了:
plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2,
align = "hv") +
theme(plot.margin = unit(c(3, 0, 0, 0), "cm")) +
coord_cartesian(clip = "off")
plot5 +
draw_plot_label(c("A", "B", "C", "D"), c(0, 0.5, 0, 0.5), c(1.1, 1.1, .5, .5))
尽管返回的错误与以前相同,但是如您所见,在图的顶部有更多可用空间。作为最后的选择,我还关闭了原始图的裁剪,但这也没有解决任何问题,例如:
plot1 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(-1, 0, 0, 0), "cm")) +
coord_cartesian(clip = "off")
仅当我经过y = 1
时才会出现此问题。 y = 1.01
会导致问题。
我该如何解决这个问题?除非ggplot
或cowplot
出现问题,否则这似乎是一个相当简单的问题。
答案 0 :(得分:1)
按照建议使用“蛋”包,我解决了问题:删除图形之间的空白并以合理的方式标记图形。
此外,值得注意的是,在绘制图中,鸡蛋似乎比牛绘图更快。
install.packages("egg")
library(egg)
df <- data.frame(x = 1:10, y = 2:11)
plot1 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(0, 0, 0, 0), "cm"))
figure <- egg::ggarrange(plot1, plot2,
plot3, plot4,
nrow = 2,ncol=2,
labels=c("A", "B", "C","D"),
label.args = list(gp=gpar(font=2), x=unit(.5,"line")))
figure
答案 1 :(得分:0)
好,所以我有一个答案,它解决了标签的问题,但不能解决无法绘制经过y=1
的问题。我没有减少原始图的顶部边距,而是减小了底部边距:
plot1 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot2 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot3 <- ggplot(df, aes(x = x, y = y)) +
geom_point() +
theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot4 <- ggplot(df, aes(x = y, y = -x)) +
geom_point() +
theme(plot.margin = unit(c(1, 0, -1, 0), "cm"))
plot5 <- plot_grid(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2,
align = "hv", labels = c("A", "B", "C", "D"),
label_x = 0.1,
label_y = 1) +
theme(plot.margin = unit(c(1, 1, 2, 1), "cm"))
plot5
对我来说,为什么剪裁标签仍然有意义(而且在y <0时也会出现)。