我正在迭代一些数据,创建我想在单个图像上一起打印的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)
}
问题是对于循环的一些迭代,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...
但这看起来很麻烦,我希望找到一个不那么生硬的解决方案。通常我会使用facet_grid()
来表示这种情况,但是当散点图被扭曲成facet_grid产生的超薄矩形时,它很难解释,因为它有超过2或3个图形。
我看到这个question似乎使用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)
}
答案 0 :(得分:10)
grid.arrange(grobs = my_plots)
应该做的伎俩。你不需要将图转换为grobs,grid.arrange为你做。但如果必须,你可以这样做:
my_grobs = lapply(my_plots, ggplotGrob)