R - 将ggplot对象列表更改为grid.arrange将接受的grob列表?

时间:2016-04-27 21:55:57

标签: r ggplot2

我正在迭代一些数据,创建我想在单个图像上一起打印的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似乎使用grobslapply来解决问题 - 这是R编程的两个方面我过去从未取得太大成功。

我怎么能:

  • 将我的ggplot对象列表更改为grid.arrange将接受的grob列表?
  • 告诉facet_grid(或类似的现有函数)我想要多行图以使它们接近方形?

这是第一个代码块中使用的函数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)
} 

1 个答案:

答案 0 :(得分:10)

grid.arrange(grobs = my_plots)

应该做的伎俩。你不需要将图转换为grobs,grid.arrange为你做。但如果必须,你可以这样做:

my_grobs = lapply(my_plots, ggplotGrob)