如何在使用gridExtra的arrange.grid创建的图表周围添加边框,其中包含一组ggplot2散点图?

16

我正在使用以下代码:

# Libs
require(ggplot2); require(gridExtra); require(grid)

# Generate separate charts
chrts_list_scts <- list()

# Data
data("mtcars")

# A
chrts_list_scts$a <- ggplot(mtcars) +
  geom_point(size = 2, aes(x = mpg, y = disp,
                           colour = as.factor(cyl))) +
  geom_smooth(aes(x = mpg, y = disp),
              method = "auto") +
  xlab("MPG") +
  ylab("Disp") +
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none")

# B
chrts_list_scts$b <- ggplot(mtcars) +
  geom_point(size = 2, aes(x = mpg, y = drat,
                           colour = as.factor(cyl))) +
  geom_smooth(aes(x = mpg, y = drat),
              method = "auto") +
  xlab("MPG") +
  ylab("Drat") +
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none")

# C
chrts_list_scts$c <- ggplot(mtcars) +
  geom_point(size = 2, aes(x = mpg, y = qsec,
                           colour = as.factor(cyl))) +
  geom_smooth(aes(x = mpg, y = qsec),
              method = "auto") +
  xlab("MPG") +
  ylab("QSEC") +
  guides(colour = guide_legend(title = "cyl")) +
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "bottom",
        legend.key = element_rect(colour = NA))

# Arrange grid
png(filename = "chrts.PNG", width = 6,
    height = 10, units = 'in', res = 300)
title_text <- c("mtcars")
chrts_list_scts$all_scts <- grid.arrange(chrts_list_scts$a,
                                         chrts_list_scts$b,
                                         chrts_list_scts$c,
                                         top =
                                           textGrob(label = title_text,
                                                    gp = gpar(
                                                      fontsize = 14,
                                                      font = 2)))
dev.off()
rm(title_text)
为了生成以下图表:

first chart

我想在该图表周围添加边框,如下图所示:

with border

尝试

我尝试通过在代码中添加 polygonGrob 来实现此请求:

chrts_list_scts$all_scts <- grid.arrange(chrts_list_scts$dep_work,
                                         chrts_list_scts$chld_work,
                                         chrts_list_scts$pens,
                                         polygonGrob(x = c(0,0.5,1.05),
                                                     y = c(0,0.5,1.05)
                                                     ),
                                         top =
                                           textGrob(label = title_text,
                                                    gp = gpar(
                                                      fontsize = 14,
                                                      font = 2)))

但是这会生成一个底部横向的无意义图表。我查看了类似的SO讨论,但我不清楚如何得出可行的解决方案。

附加要求

除了生成边框外,我还希望:

  1. 能够控制边框的美学效果,如更改边框的大小和颜色。
  2. 理想情况下,我希望将这个解决方案封装在arrange.grid调用中,因此对象chrts_list_scts $ all_scts包括所有元素,包括图表和整齐的边框。

如果有建议的解决方案符合剩余两个要点,我将很高兴接受解决边框的主要要求。


你读过这个SO答案吗? - Eric Fail
如果我没记错的话,我在我的帖子中链接了这个答案。当我寻找类似问题时,我偶然发现了它,但是我不清楚如何实现所需的效果。 - Konrad
我的错(我的评论有长度限制,所以这里加了一些填充文本来解决这个烦人的限制) - Eric Fail
@EricFail 没问题,非常感谢您对我的小问题表示关注。 - Konrad
2个回答

12

1) 从问题提供的链接中使用鸢尾花示例(但进一步简化),只需添加最后一行即可。修改gpar(...)组件(可能还包括widthheight),以获得不同的美学效果。(这不包含在grid.arrange调用中。)

library(ggplot2)
library(grid)
library(gridExtra)

g <- ggplot(iris, aes(Sepal.Width, Sepal.Length)) + geom_point()
grid.arrange(g, g, ncol=2)


# next line adds border
grid.rect(width = .98, height = .98, gp = gpar(lwd = 2, col = "blue", fill = NA))

(故事情节继续)

屏幕截图

2) 这是解决方案(1)的变体,其中正面将图形和边框都封装在gt gTree中,通过创建grobs来容纳每一个元素。然而,这也涉及一些额外的复杂性:

grid.newpage()
ga <- arrangeGrob(g, g, ncol = 2)
gb <- rectGrob(height = .98, width = .98, gp = gpar(lwd = 2, col = "blue", fill = NA)) # border, no fill
gt <- gTree(children = gList(ga, gb))
grid.draw(gt)

在结尾处添加了封装的解决方案。 - G. Grothendieck
2
非常感谢您提供的出色解决方案。在某个时候,我将 fill = NA 添加到语句 grid.rect(width = .98, height = 1, gp = gpar(lwd = 1, col = "black", fill = NA)) 中,因为在图表定义后添加 grid.rect 行后,我得到了一个覆盖图表的白色正方形。 - Konrad

2
你可以将rectGrob添加到gtable中。
grid.draw(gtable::gtable_add_grob(arrangeGrob(g, g, ncol=2),
             rectGrob(gp=gpar(lwd=5, fill=NA)), 1, 1, 1, 2))

注意:必须使用fill=NAfill='transparent',否则矩形可能会遮盖在它下面的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接