2016-09-28 28 views
8

私はggplot2を使ってグラフをプロットしていますが、facet_wrap関数を複数のグラフ(〜51)に作成していますが、すべて1ページに表示されています。検索後、ggplot2は複数のページにグラフを配置できないことがわかりました。ggplot2:複数のページをプロットする

これを行う方法はありますか?この質問(Multiple graphs over multiple pages using ggplot)を見て、ほとんど成功していないコードを試しました。

ここに私のグラフのコードがあります。これは、1ページに~51グラフを作成し、非常に小さくて見にくく、これをpdfの1ページあたり1グラフに印刷できればそれは素晴らしいでしょう:

ggplot(indbill, aes(x = prey, y = weight), tab) + 
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
facet_wrap(~ individual) + 
theme(axis.ticks.x = element_blank(), 
    axis.text.x = element_text(size=rel(0.5)), 
    axis.ticks.y = element_blank(), 
    axis.text.y = element_blank()) + 
xlab("") + ylab("") + 
guides(color = guide_legend(ncol=2)) + 
coord_radar() 

誰かが少しコードを書いて、それを私に説明できるとすれば、それは素晴らしいことです!

ありがとうございます!

答えて

8

1つのオプションは、あなたが今使っている同じコードを使用して、一度に、たとえば、単にプロットにindividualの6つのレベルです。データのサブセットごとに1回ずつ、複数回反復するだけで済みます。

library(ggplot2) 
library(vcd) # For the Baseball data 
data(Baseball) 

pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
    print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
        aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw()) 
} 
dev.off() 

上記のコードは、プロットの4ページ、ページへの6つのファセットを有する各付きPDFファイルが生成されます:あなたはので、ここでBaseballデータフレームを使用した例ですが、サンプルデータを提供していません。あなたはまた、6つのファセットのグループごとに4つの別々のPDFファイル、1を作成することができます:あなたはより多くの柔軟性が必要な場合

for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    ...ggplot code... 
dev.off() 
} 

別のオプションは、レベルごとに別々のプロットを作成することです(つまり、それぞれ固有の値)ファセット変数の値を計算し、個々のプロットをすべてリストに保存します。次に、各ページに任意の数のプロットをレイアウトすることができます。これはおそらくここでは過剰ですが、柔軟性が役立つhere's an exampleがあります。

まず、すべてのプロットを作成します。ファセット設定の列にteam87を使用します。そこで、各レベルのプロットをteam87にしたいと考えています。データをteam87で分割し、データの各サブセットごとに別々のプロットを作成します。

splitは、レベルをteam87の別々のデータフレームに分割します。 lapplyラッパーは、各データサブセットをggplotに順次フィードして各チームのプロットを作成します。出力はplistに保存されます。このリストは(この場合は)24個のプロットです。

plist = lapply(split(Baseball, Baseball$team87), function(d) { 
    ggplot(d, aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw() + 
    theme(plot.margin=unit(rep(0.4,4),"lines"), 
      axis.title=element_blank()) 
}) 

ここで、6つのプロットをPDFファイルにレイアウトします。以下に2つのオプションがあります.1つは4つのPDFファイルで、それぞれ6つのプロットがあり、もう1つは4ページのPDFファイルが1つあります。私はまた、一番下のプロットの1つに貼り付けました。軸のタイトルを追加するためにleftbottom引数を使用することを含む、プロットのレイアウトにはgrid.arrangeを使用します。

library(gridExtra) 

# Four separate single-page PDF files, each with six plots 
for (i in seq(1, length(plist), 6)) { 
    pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
    dev.off() 
} 

# Four pages of plots in one PDF file 
pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(plist), 6)) { 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
} 
dev.off() 
+0

こんにちはeipi10!それはすばらしく働き、理解しやすいものでした!私は1つの問題がありますが。コードは私の個人の1人が好きではないようですが、私はこのエラーを受けています。この個所に当たった後、印刷を停止します。 '= list(gbs(705-70773 = list(grobs = list(list = x = 0.5、y = 0。5、: "gList"に 'grobs'しか許可されていません。 助けがあれば助かります! – LearningTheMacros

+1

その個人のプロットが生成されないというデータがありますか?プロットがない場合、プロットコードの出力はgrob(グラフィックスオブジェクト)になりません。たとえば、その個人またはそのようなものについてすべてのデータが欠落していますか?プロットを作成してみてください.ggplotにその個人のデータだけでデータフレームを送り、何が起こるかを見てください。その個人のデータを見て、明らかに異なるものがあるかどうかを確認します。 – eipi10

+0

HubertLの提案を使用したときにプロットが作成されたので、私はうんざりします。いずれにせよ、私はあなたの答えを理解し、それは将来私を助けるでしょう。 もう一度おねがいします! – LearningTheMacros

2

何かのように:

by(indbill, indbill$individual, function (x){ 
    ggplot(x, aes(x = prey, y = weight), tab) + 
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
    theme(axis.ticks.x = element_blank(), 
     axis.text.x = element_text(size=rel(0.5)), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_blank()) + 
    xlab("") + ylab("") + 
    guides(color = guide_legend(ncol=2)) + 
    coord_radar() 
} 
関連する問題