在多个图上用y> 1绘制时,Cowplot剪辑标签

时间:2019-01-23 11:08:23

标签: r ggplot2 plot cowplot

首先,一些模拟图:

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).  

enter image description here

这意味着即使有足够的空间,它也删除了两个顶部标签。因此,我想也许是在绘制标签之后才应用绘图边距,或者可能是裁切引起了问题。所以,我这样做了:

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))   

enter image description here 尽管返回的错误与以前相同,但是如您所见,在图的顶部有更多可用空间。作为最后的选择,我还关闭了原始图的裁剪,但这也没有解决任何问题,例如:

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会导致问题。 我该如何解决这个问题?除非ggplotcowplot出现问题,否则这似乎是一个相当简单的问题。

2 个答案:

答案 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

enter image description here

答案 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

这让我在合理的位置绘制标签。 enter image description here

对我来说,为什么剪裁标签仍然有意义(而且在y <0时也会出现)。