web-dev-qa-db-ja.com

複数のページにプロット

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

これを行う方法はありますか?私はこの質問( ggplotを使用した複数ページにわたる複数のグラフ )を見て、ほとんど成功せずにコードを試してみました。

これが私のグラフのコードです。1ページに最大51個のグラフが生成され、非常に小さく見づらくなります。これをPDFのページごとに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()

誰かが小さなコードを書いて私にそれを説明できたら、それは素晴らしいことです。

15

1つのオプションは、たとえば現在使用しているのと同じコードを使用して、一度に6レベルのindividualをプロットすることです。データのサブセットごとに1回ずつ、数回繰り返す必要があります。サンプルデータが提供されていないため、Baseballデータフレームを使用した例を次に示します。

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ページのプロットを含むPDFファイルを生成します。各ページには6つのファセットがあります。4つの個別のPDFファイル、 6つのファセットの各グループ:

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

さらに柔軟性が必要な場合の別のオプションは、ファセット変数のレベルごと(つまり、一意の値ごと)に個別のプロットを作成し、個々のプロットをすべてリストに保存することです。次に、各ページに任意の数のプロットを配置できます。これはおそらくやり過ぎですが、柔軟性は非常に役立ちます ここに例があります

まず、すべてのプロットを作成しましょう。 team87をファセット列として使用します。したがって、team87のレベルごとに1つのプロットを作成します。これを行うには、データを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())
})

PDFファイルで一度に6つのプロットをレイアウトします。以下は2つのオプションです。1つは4つの別々のPDFファイルで、それぞれ6つのプロットを含みます。もう1つの4ページのPDFファイル。下部のプロットの1つにも貼り付けました。grid.arrangeを使用して、プロットをレイアウトします。 leftおよびbottom引数を使用して、軸のタイトルを追加します。

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()
13
eipi10

ページ付けには複数の方法があります: ggforce または gridExtra :: marrangeGrob 。別の例については、この answer も参照してください。

ggforce:

library(ggplot2)
library(ggforce)

# Standard facetting: too many small plots
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap(~cut:clarity, ncol = 3)

# Pagination: page 1
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 1)

# Pagination: page 2
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 2)

# Works with grid as well
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_grid_paginate(color~cut:clarity, ncol = 3, nrow = 3, page = 4)

gridExtra:

library(gridExtra)

set.seed(123)
pl <- lapply(1:11, function(.x) 
  qplot(1:10, rnorm(10), main=paste("plot", .x)))

ml <- marrangeGrob(pl, nrow=2, ncol=2)

## non-interactive use, multipage pdf
## ggsave("multipage.pdf", ml)
## interactive use; calling `dev.new` multiple times
ml

reprexパッケージ (v0.2.0.9000)によって2018-08-09に作成されました。

8
Tung

何かのようなもの :

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()
}
2
HubertL