显示存储在列表中的一系列 ggplot 图时控制布局
Control layout when displaying a series of ggplot plots stored in a list
我想在绘制一系列 ggplots 时控制布局
我已经存储在列表中(在其他地方自动生成)。
我可以绘制一系列如下图。
library(ggplot2)
library(grid)
library(gridExtra)
p1 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="red")
p2 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="orange")
p3 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="yellow")
p4 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="green")
grid.arrange(p1, p2, p3, p4)
然后我可以更改它们的布局,如 所示。
grid.arrange(p1, p2, p3, p4, layout_matrix=cbind(c(1,2), c(3,4)))
如果它们存储在列表中,我也可以绘制一系列图,如 here 所示。
myplotslist <- list(p1, p2, p3, p4)
do.call(grid.arrange, c(myplotslist, ncol=2))
但是如果我尝试使用 layout_matrix 更改布局,我会收到错误消息(和一些警告)。
do.call(grid.arrange, c(myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4))))
Error in gList(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, height = 1, :
only 'grobs' allowed in "gList"
In addition: Warning messages:
1: In grob$wrapvp <- vp : Coercing LHS to a list
2: In grob$wrapvp <- vp : Coercing LHS to a list
3: In grob$wrapvp <- vp : Coercing LHS to a list
4: In grob$wrapvp <- vp : Coercing LHS to a list
我试过将绘图对象强制为 grobs,但遇到同样的错误。
myplotslist2 <- list(ggplotGrob(p1), ggplotGrob(p2), ggplotGrob(p3), ggplotGrob(p4))
我正在使用 R 3.2.1、ggplot2 2.0.0、grid 3.2.1 和 gridExtra 2.0.0,非常感谢您的建议。
不太确定为什么,但这似乎有效:
do.call(grid.arrange, c(myplotslist, ncol=2, layout_matrix=list(cbind(c(1,2), c(3,4)))))
您传递给 do.call
的函数的参数实际上应该是一个列表。来自 ?do.call
:
args
a list of arguments to the function call. The names
attribute of
args
gives the argument names.
错误告诉您您的其他参数正在传递给 grid.arrange
的 grobs
参数。要阻止这种情况,请将其放入列表中(c
在这里扁平化太多)并为 myplotslist
:
指定 grobs
参数名称
do.call(grid.arrange, list(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4))))
...或者你可以完全放弃 do.call
(h/t Baptiste):
grid.arrange(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4)))
我想在绘制一系列 ggplots 时控制布局 我已经存储在列表中(在其他地方自动生成)。
我可以绘制一系列如下图。
library(ggplot2)
library(grid)
library(gridExtra)
p1 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="red")
p2 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="orange")
p3 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="yellow")
p4 <- ggplot(mtcars, (aes(x=mpg, fill=as.factor(1)))) + geom_density() +
scale_fill_manual(values="green")
grid.arrange(p1, p2, p3, p4)
然后我可以更改它们的布局,如
grid.arrange(p1, p2, p3, p4, layout_matrix=cbind(c(1,2), c(3,4)))
如果它们存储在列表中,我也可以绘制一系列图,如 here 所示。
myplotslist <- list(p1, p2, p3, p4)
do.call(grid.arrange, c(myplotslist, ncol=2))
但是如果我尝试使用 layout_matrix 更改布局,我会收到错误消息(和一些警告)。
do.call(grid.arrange, c(myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4))))
Error in gList(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, height = 1, :
only 'grobs' allowed in "gList"
In addition: Warning messages:
1: In grob$wrapvp <- vp : Coercing LHS to a list
2: In grob$wrapvp <- vp : Coercing LHS to a list
3: In grob$wrapvp <- vp : Coercing LHS to a list
4: In grob$wrapvp <- vp : Coercing LHS to a list
我试过将绘图对象强制为 grobs,但遇到同样的错误。
myplotslist2 <- list(ggplotGrob(p1), ggplotGrob(p2), ggplotGrob(p3), ggplotGrob(p4))
我正在使用 R 3.2.1、ggplot2 2.0.0、grid 3.2.1 和 gridExtra 2.0.0,非常感谢您的建议。
不太确定为什么,但这似乎有效:
do.call(grid.arrange, c(myplotslist, ncol=2, layout_matrix=list(cbind(c(1,2), c(3,4)))))
您传递给 do.call
的函数的参数实际上应该是一个列表。来自 ?do.call
:
args
a list of arguments to the function call. Thenames
attribute ofargs
gives the argument names.
错误告诉您您的其他参数正在传递给 grid.arrange
的 grobs
参数。要阻止这种情况,请将其放入列表中(c
在这里扁平化太多)并为 myplotslist
:
grobs
参数名称
do.call(grid.arrange, list(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4))))
...或者你可以完全放弃 do.call
(h/t Baptiste):
grid.arrange(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4)))