网格排列 textGrob() 和 ggplots。标题和副标题网格Extra
grid arrange textGrob() and ggplots. Title and subtitle gridExtra
基本上,我想为 grid.arrange() 图添加标题和副标题。
我有 plot_list
这是一个包含 15 个 ggplots 和
的列表
tg <- textGrob('Title', gp = gpar(fontsize = 13, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))
但这不起作用。我没有收到任何错误,但是 tg
和 sg
没有出现在图中。
grid.arrange(tg, sg, grobs = plot_list, ncol = 3)
老实说,我不是 gridExtra
和 grid
方面的专家,所以任何建议都将不胜感激
在 changing multiple line title in multiplot ggplot2 using grid.arrange 之后,我可以通过创建两个网格来完成您的要求,第一个网格只有图,第二个网格有标题、副标题和第一个网格。使用合成 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")))
希望对您有所帮助!
您需要将 tg、sg 和您的绘图合并到一个列表中。我会指定一个布局矩阵,它给你更多的控制,并使用 grid.arrange:
进行绘图
首先,我们有 tg,sg,我用 mtcars 做了一个 plot_list 3。
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))
top
参数可以接受任何 grob 但它需要知道它的高度才能被赋予正确的 space,
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)
基本上,我想为 grid.arrange() 图添加标题和副标题。
我有 plot_list
这是一个包含 15 个 ggplots 和
tg <- textGrob('Title', gp = gpar(fontsize = 13, fontface = 'bold'))
sg <- textGrob('Subtitle', gp = gpar(fontsize = 10))
但这不起作用。我没有收到任何错误,但是 tg
和 sg
没有出现在图中。
grid.arrange(tg, sg, grobs = plot_list, ncol = 3)
老实说,我不是 gridExtra
和 grid
方面的专家,所以任何建议都将不胜感激
在 changing multiple line title in multiplot ggplot2 using grid.arrange 之后,我可以通过创建两个网格来完成您的要求,第一个网格只有图,第二个网格有标题、副标题和第一个网格。使用合成 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")))
希望对您有所帮助!
您需要将 tg、sg 和您的绘图合并到一个列表中。我会指定一个布局矩阵,它给你更多的控制,并使用 grid.arrange:
进行绘图首先,我们有 tg,sg,我用 mtcars 做了一个 plot_list 3。
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))
top
参数可以接受任何 grob 但它需要知道它的高度才能被赋予正确的 space,
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)