fre*_*tal 5 r ggplot2 gridextra
在绘制一系列存储在列表中的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)
Run Code Online (Sandbox Code Playgroud)
然后我就可以改变自己的布局,指示在这里。
grid.arrange(p1, p2, p3, p4, layout_matrix=cbind(c(1,2), c(3,4)))
Run Code Online (Sandbox Code Playgroud)
我还可以绘制了一系列图表,如果它们被存储在一个列表,显示在这里。
myplotslist <- list(p1, p2, p3, p4)
do.call(grid.arrange, c(myplotslist, ncol=2))
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用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
Run Code Online (Sandbox Code Playgroud)
我尝试将绘图对象强制转换为grobs,但遇到相同的错误。
myplotslist2 <- list(ggplotGrob(p1), ggplotGrob(p2), ggplotGrob(p3), ggplotGrob(p4))
Run Code Online (Sandbox Code Playgroud)
我正在使用R 3.2.1,ggplot2 2.0.0,grid 3.2.1和gridExtra 2.0.0,非常感谢您的建议。
您传递给函数的参数do.call实际上应该是一个列表。从?do.call:
args函数调用的参数列表 。names的属性 给出args了参数名称。
这些错误告诉您您的其他参数正在传递给grobs的参数grid.arrange。要阻止这种情况,请将其放入列表中(c此处过于扁平化)并指定grobs参数名称myplotslist:
do.call(grid.arrange, list(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4))))
Run Code Online (Sandbox Code Playgroud)
...或者你可以do.call完全放弃(h/t Baptiste):
grid.arrange(grobs = myplotslist, ncol=2, layout_matrix=cbind(c(1,2), c(3,4)))
Run Code Online (Sandbox Code Playgroud)