2016-04-27 9 views
2

私はggplotグラフィックスのリストを作成して、1つのイメージにまとめて印刷したいと思っています。私のコードには、2つのループがあります。外部ループは、1つの変数に基づいてデータを細分化します。内側のループは、データをさらに細分化し、細分ごとに散布図を作成します。プロットはリストに保存されます。内側のループが完了すると、grid.arrangeオブジェクトは、次のようにリストオブジェクトを使用して作成されR - ggplotオブジェクトのリストを、grid.arrangeが受け入れるgrobsのリストに変更しますか?

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_scatterが含まれます)ループのいくつかの反復では、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()を使用しますが、生成する2〜3つ以上のプロットがある場合、ファセット・グリッドが生成する超薄矩形に歪んだ場合、散布図を解釈することは困難です。

これはgrobslapplyを使用して問題を解決しているようですが、これは私が過去に多くの成功を収めたことのないRプログラミングの2つの側面です。

どのようにすることができます私はどちらか:

  • 変更受け入れるgrid.arrange grobsのリストにggplotオブジェクトの私のリスト?
  • 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) 
} 
+0

をところで、あなたの第二設問のために、クラスをチェックするために 'facet_wrap' – baptiste

+1

BTW2のnrow/NcoI部位の引数をチェックし、より簡潔な方法は、' stopifnot(継承(DF、「だろうdata.frame "))' – baptiste

答えて

9
grid.arrange(grobs = my_plots) 

は、トリックを行う必要があります。プロットをgrobsに変換する必要はありません。grid.arrangeはそれを行います。あなたは、あなたが行うことができなければならない場合でも:

my_grobs = lapply(my_plots, ggplotGrob) 
関連する問題