0

基本上,我想为 grid.arrange() 绘图添加标题和副标题。

我有plot_list一个 15 个 ggplots 的列表和

tg <- textGrob('Title', gp = gpar(fontsize = 13, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))

但这不起作用。我没有收到任何错误,但tgsg没有出现在情节中。

grid.arrange(tg, sg, grobs = plot_list, ncol = 3)

老实说,我不是专家,gridExtra所以grid任何建议都将不胜感激

4

3 回答 3

3

使用 grid.arrange 更改 multiplot ggplot2 中的多行标题之后,我可以通过创建两个网格来完成您所要求的操作,首先只有绘图,第二个使用标题、副标题和第一个网格。使用合成plot_list

df <- data.frame(v1 = rnorm(1000))
plot_list <- list()
for (i in 1:15) {
  df[,ncol(df)+1] <- rnorm(1000)
  names(df)[ncol(df)] <- paste0("V_",as.character(i))
  local({
    i <- i
    plot_list[[i]] <<- ggplot(df) + geom_point(aes_string(x = "v1", y = paste0("V_",as.character(i))))
  })
}
tg <- textGrob('Title', gp = gpar(fontsize = 13, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))
margin <- unit(0.5, "line")
grided <- gridExtra::grid.arrange(grobs = plot_list, ncol = 3)
gridExtra::grid.arrange(tg, sg, grided,
                        heights = unit.c(grobHeight(tg) + 1.2*margin, 
                                         grobHeight(sg) + margin, 
                                         unit(1,"null")))

网格

希望这可以帮助!

于 2019-11-30T11:51:43.607 回答
3

您需要将 tg、sg 和您的图组合成一个列表。我会指定一个布局矩阵,它给你更多的控制,并使用 grid.arrange 进行绘图:

首先,我们有 tg,sg,我用 mtcars 制作了一个 3 的 plot_list。

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

tg <- textGrob('Title', gp = gpar(fontsize = 13, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))

plot_list <- lapply(c("drat","wt","qsec"),function(i){
  ggplot(mtcars,aes_string("mpg",i))+geom_point()
})

我们将您的地块合并到一个列表中:

g = c(list(tg),list(sg),plot_list)

所以现在 tg 是第一个元素,sg 是第二个元素,你的地块是 3-5。我们指定布局:

N = length(plot_list)
laym = rbind(rep(1,N),rep(2,N),(3:(N+2)))
laym
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    4    5

这个矩阵将有第一个(tg),1 占据第一行,sg 第二行,你的地块第三行。如果您有其他类型的安排或列表,您可以相应地更改它。

现在我们绘图,并使用 heights=... 指定相对高度

grid.arrange(grobs=g,layout_matrix=laym,heights=c(1,1,10))

在此处输入图像描述

于 2019-11-30T12:24:08.537 回答
1

参数可以采用任何 grob ,top但它需要知道它的高度才能获得正确的空间,

library(grid)
library(gridExtra)

lg <- replicate(12, ggplot2::ggplot(), simplify = FALSE)
tg <- textGrob('Title', gp = gpar(fontsize = 50, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))

lt <- list(tg, sg)
heights <- do.call(unit.c, lapply(lt, function(.g) 1.5*grobHeight(.g)))
titles <- gtable::gtable_matrix('title', 
                                grobs = matrix(lt, ncol=1), 
                                widths = unit(1,'npc'),
                                heights = heights)

grobHeight.gtable <- function(g) sum(g$heights)

grid.arrange(grobs = lg, top = titles)
于 2019-12-02T06:58:26.657 回答