2012-09-02 6 views
16

私はリストpを持っています。ここで、各要素pはggplot2プロットオブジェクトのリストです。1つのpdfに複数のggplotsを印刷すると、1ページに複数のプロットが表示されます

出力p[[1]]のプロットは、1ページ上にあることをpなどのすべてのプロットを含む単一のPDFファイルをしたいI、p[[2]]のプロットは、私がこれを行う可能性がありますどのようにその他ページ2、上にありますか?

ここでは、私が作業しているデータ構造を提供するためのコード例をいくつか示します - 退屈なプロットのためのお詫び、私は無作為に変数を選びました。

require(ggplot2) 
p <- list() 

cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    p[[i]] <- list() 
    dat <- subset(diamonds, cut==cuts[i]) 
    p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
} 
+0

ここには、潜在的なスタートがあります: 'require(gridExtra); do.call( "grid.arrange"、p [[i]]) '。これは、単一デバイス内のggplotオブジェクトをp [[i]]にプロットし、うまく配置します。 – Michael

+0

gridExtraパッケージも参照してください。私はそれがあなたの道のほとんどを得るべきだと思う。 – chandler

答えて

15

この解決方法は、リストpのリストの長さが異なるかどうかとは無関係です。そのためonefile = TRUE機能pdf

library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
for (i in seq(length(p))) { 
    do.call("grid.arrange", p[[i]]) 
} 
dev.off() 

は同じファイル(1つのグラフィックの1ページ)に順次登場するすべてのグラフィックスが保存されます。

+0

これは完璧に働いた、ありがとう! – Michael

+1

私の場合は、PDFが破損して開くことができません。プロットは個別に細かく見えます。任意のヒント? –

+0

opts()は 'ggplot2_2.2.1'と' R version 3.3.2 'で動作しませんでした。代わりに '+ ggtitle(cuts [i])'を使用してください。 –

2

は、ここで一つの解決策だが、私は特にそれ好きではない:

ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))

問題は、それが各グループ内でのプロットの数が同じであることに依存しているということです。 all(sapply(p, length) == 2)が偽であった場合、それは壊れるでしょう。

7

R初心者のためのSvenのソリューションの簡単なバージョンです。これは、do.callやネストされたリストを盲目的に使って、必要でも理解していないものでもありません。経験的な証拠がある。 :)

library(ggplot2) 
library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    dat <- subset(diamonds, cut==cuts[i]) 
    top.plot <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    bottom.plot <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
    grid.arrange(top.plot, bottom.plot) 
} 
dev.off() 
関連する問題