Hug*_*ugh 22 layout r ggplot2 gridextra gtable
grid.arrange
在gridExtra
包中使用相对简单的方法在矩阵中排列多个图,但是ggplot2
当一些图比其他图更大时,如何安排图(我正在处理的图)?在基础上,我可以使用layout()
如下例子:
nf <- layout(matrix(c(1,1,1,2,3,1,1,1,4,5,6,7,8,9,9), byrow=TRUE, nrow=3))
layout.show(nf)
Run Code Online (Sandbox Code Playgroud)
ggplot
情节的等价物是什么?
包含的一些情节
library(ggplot2)
p1 <- qplot(x=wt,y=mpg,geom="point",main="Scatterplot of wt vs. mpg", data=mtcars)
p2 <- qplot(x=wt,y=disp,geom="point",main="Scatterplot of wt vs disp", data=mtcars)
p3 <- qplot(wt,data=mtcars)
p4 <- qplot(wt,mpg,data=mtcars,geom="boxplot")
p5 <- qplot(wt,data=mtcars)
p6 <- qplot(mpg,data=mtcars)
p7 <- qplot(disp,data=mtcars)
p8 <- qplot(disp, y=..density.., geom="density", data=mtcars)
p9 <- qplot(mpg, y=..density.., geom="density", data=mtcars)
Run Code Online (Sandbox Code Playgroud)
Rol*_*and 12
您可以使用嵌套arrangeGrob
调用,如下例所示:
library(ggplot2)
library(gridExtra)
p <- ggplot(data.frame(x=1, y=1), aes(x,y)) + geom_point()
grid.arrange(
arrangeGrob(
p,
arrangeGrob(p, p, nrow=2),
ncol=2 ,widths=c(2,1)),
arrangeGrob(p, p ,p ,ncol=3, widths=rep(1,3)),
nrow=2)
Run Code Online (Sandbox Code Playgroud)
编辑:
gl <- lapply(1:9, function(ii) grobTree(rectGrob(),textGrob(ii)))
grid.arrange(
arrangeGrob(gl[[1]],
do.call(arrangeGrob, c(gl[2:5], ncol=2)),
nrow=1,
widths=3:2),
do.call(arrangeGrob, c(gl[6:9], nrow=1, list(widths=c(1,1,1,2)))),
nrow=2, heights=c(2,1))
Run Code Online (Sandbox Code Playgroud)
bap*_*ste 11
gtable的另一种选择
library(gtable)
gl <- lapply(1:9, function(ii) grobTree(textGrob(ii), rectGrob()))
# gl <- lapply(1:9, function(ii) ggplotGrob(qplot(1,1) + ggtitle(ii)))
gt <- gtable(widths=unit(rep(1,5), "null"),
heights=unit(rep(1,3), "null"))
gtable_add_grobs <- gtable_add_grob # alias
gt <- gtable_add_grobs(gt, gl,
l=c(1,4,5,4,5,1,2,3,4),
r=c(3,4,5,4,5,1,2,3,5),
t=c(1,1,1,2,2,3,3,3,3),
b=c(2,1,1,2,2,3,3,3,3))
grid.newpage()
grid.draw(gt)
Run Code Online (Sandbox Code Playgroud)
您可以使用与布局相同的矩阵界面grid.arrange
,
library(gridExtra)
library(grid)
gl <- lapply(1:9, function(ii) grobTree(rectGrob(), textGrob(ii)))
grid.arrange(grobs = gl, layout_matrix = rbind(c(1,1,1,2,3),
c(1,1,1,4,5),
c(6,7,8,9,9)))
Run Code Online (Sandbox Code Playgroud)
和ggplots一样的作品; 请注意,NA可用于指示空白单元格.结果是gtable,兼容ggsave()
.
gl <- replicate(9, ggplot(), FALSE)
grid.arrange(grobs = gl, layout_matrix = rbind(c(1,1,1,2,3),
c(1,1,1,4,5),
c(6,7,8,NA,9)))
Run Code Online (Sandbox Code Playgroud)
我很欣赏所有其他答案,但Didzis Elferts对OP的评论与我发现最容易实现的答案相关.
library(ggplot2)
p1 <- qplot(x=wt,y=mpg,geom="point",main="Scatterplot of wt vs. mpg", data=mtcars)
p2 <- qplot(x=wt,y=disp,geom="point",main="Scatterplot of wt vs disp", data=mtcars)
p3 <- qplot(wt,data=mtcars)
p4 <- qplot(wt,mpg,data=mtcars,geom="boxplot")
p5 <- qplot(wt,data=mtcars)
p6 <- qplot(mpg,data=mtcars)
p7 <- qplot(disp,data=mtcars)
p8 <- qplot(disp, y=..density.., geom="density", data=mtcars)
p9 <- qplot(mpg, y=..density.., geom="density", data=mtcars)
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout = grid.layout(3, 5))) # 3 rows, 5 columns
print(p1, vp = vplayout(1:2, 1:3)) # the big plot covers rows 1:2 and cols 1:3
print(p2, vp = vplayout(1, 4))
print(p3, vp = vplayout(1, 5))
print(p4, vp = vplayout(2, 4))
print(p5, vp = vplayout(2, 5))
print(p6, vp = vplayout(3, 1))
print(p7, vp = vplayout(3, 2))
print(p8, vp = vplayout(3, 3))
print(p9, vp = vplayout(3, 4:5))
Run Code Online (Sandbox Code Playgroud)
我喜欢这个lay_out
函数提供的接口(以前在wq
包中).它需要表单的参数list(plot, row(s), column(s))
.对于你的例子:
lay_out(list(p1, 1:2, 1:3),
list(p2, 1, 4),
list(p3, 1, 5),
list(p4, 2, 4),
list(p5, 2, 5),
list(p6, 3, 1),
list(p7, 3, 2),
list(p8, 3, 3),
list(p9, 3, 4:5))
Run Code Online (Sandbox Code Playgroud)
产量:
lay_out = function(...) {
x <- list(...)
n <- max(sapply(x, function(x) max(x[[2]])))
p <- max(sapply(x, function(x) max(x[[3]])))
grid::pushViewport(grid::viewport(layout = grid::grid.layout(n, p)))
for (i in seq_len(length(x))) {
print(x[[i]][[1]], vp = grid::viewport(layout.pos.row = x[[i]][[2]],
layout.pos.col = x[[i]][[3]]))
}
}
Run Code Online (Sandbox Code Playgroud)
(代码来自该wq
软件包的先前版本,来自非官方Github CRAN镜像的提交历史记录.)
归档时间: |
|
查看次数: |
9525 次 |
最近记录: |