我正在迭代一些数据,创建ggplot我想在单个图像上一起打印的图形列表.我的代码有两个循环,一个在另一个循环中.外循环根据一个变量细分数据.内部循环进一步细分数据并为每个细分生成散点图; 这些图保存在列表中.一旦内部循环完成,就会使用像这样的列表对象创建grid.arrange对象(注意:此代码包含一个自定义函数,my_scatter在此问题的底部共享):
require(ggplot2)
require(grid)
require(gridExtra)
PRIMARY LOOP STRUCTURE {
...
my_plots = list()
for (j in c(1:length(my_nodes))){
cur_node = my_nodes[j]
node_dat = temp_dat[temp_dat$Node == cur_node,]
p = my_scatter(node_dat, "PRE", "POST") + geom_point(aes(color = Node, shape = Recurrence_Type, size = 2))
my_plots[[j]] = p
}
grid.arrange(my_plots[[1]],my_plots[[2]],my_plots[[3]],my_plots[[4]],my_plots[[5]], nrow = 4, ncol = 3)
}
Run Code Online (Sandbox Code Playgroud)
问题是对于循环的一些迭代,my_plots将具有不同数量的元素.我知道我可以通过一系列条件语句来解决这个问题:
if (length(my_plots) == 2) {
grid.arrange(my_plots[[1]],my_plots[[2]],nrow=1,ncol=2)
} elsif ( length(my_plots == 3) {
grid.arrange(my_plots[[1]],my_plots[[2]],nrow=2,ncol=2)
} elsif...
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦,我希望找到一个不那么生硬的解决方案.通常情况下我会用facet_grid()这种东西,但是当散射图被扭曲成facet_grid产生的超过2或3个图时产生的超薄矩形时很难解释.
我看到,这个问题似乎解决使用问题grobs和lapply-这都是R编程我从来没有过很大的成功,在过去的两个方面.
我怎么能:
这是my_scatter第一个代码块中使用的函数:
my_scatter = function (df,a,b) {
test1 = class(df)
if (! test1 == "data.frame") {
stop("1st Variable should be a data frame")
}
test2 = class(df[,a])
valid_classes = c("integer", "numeric")
if (! test2 %in% valid_classes) {
stop("2nd Variable should either be an integer or numeric")
}
test3 = class(df[,b])
if (! test3 %in% valid_classes) {
stop("3rd Variable should either have class numeric or integer")
}
p = ggplot(data = df, aes_string(a, b)) + xlim(0,1) + ylim(0,1) + geom_point() + geom_abline(slope = 1, intercept = 0, color = "white")
return(p)
}
Run Code Online (Sandbox Code Playgroud)
bap*_*ste 11
grid.arrange(grobs = my_plots)
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.你不需要将图转换为grobs,grid.arrange为你做.但如果你不得不这样做,你可以这样做:
my_grobs = lapply(my_plots, ggplotGrob)
Run Code Online (Sandbox Code Playgroud)