38

リストがあります。pここで、の各要素はpggplot2プロットオブジェクトのリストです。

のプロットが1ページpにあるように、のすべてのプロットを含む単一のpdfを出力したいと思います。のプロットは2ページにあります。これを行うにはどうすればよいですか?p[[1]]p[[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])
}
4

8 に答える 8

27

このソリューションは、リスト内のリストの長さpが異なるかどうかとは無関係です。

library(gridExtra)

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

onefile = TRUEこの機能によりpdf、同じファイルに順番に表示されるすべてのグラフィックが保存されます(1つのグラフィックに対して1ページ)。

于 2012-09-02T12:09:31.687 に答える
17

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

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()
于 2014-05-16T03:14:52.773 に答える
15

ggplot2::ggsave()これは、とを使用してggplotオブジェクトのリストを単一のpdfファイルにエクスポートするための最も洗練されたソリューションですgridExtra::marrangeGrob()

library(ggplot2)
library(gridExtra)

を使用して複数のプロットを作成するとしますlapply()

p <- lapply(names(mtcars), function(x) {
  ggplot(mtcars, aes_string(x)) + 
    geom_histogram()
})

pプロットのリストを保存します。

ggsave(
   filename = "plots.pdf", 
   plot = marrangeGrob(p, nrow=1, ncol=1), 
   width = 15, height = 9
)
于 2020-04-30T20:22:57.940 に答える
6

私はこれらの解決策のいくつかを試しましたが、成功しませんでした。私はもう少し調べて、私にとって完璧に機能する解決策を見つけました。すべてのグラフィックを1つのPDFファイルに保存し、各グラフを1ページに保存します。

library(ggplot2)


pdf("allplots.pdf",onefile = TRUE)
for(i in glist){
   tplot <- ggplot(df, aes(x = as.factor(class), y = value))
   print(tplot)
}
dev.off()
于 2018-12-10T02:19:13.633 に答える
5

これが1つの解決策ですが、私は特に好きではありません。

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

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

于 2012-09-02T08:14:14.050 に答える
4

ggpubrパッケージ(Github上のパッケージ、インストール用のコード:)でうまくいったソリューションdevtools::install_github("kassambara/ggpubr")

4つのプロットp1、p2、p3、およびp4があるとします。

library(ggpubr)
multi.page <- ggarrange(p1,p2,p3,p4, nrow=1, ncol=1) # for one plot per page
multi.page[[1]] # for seeing the first plot
ggexport(multi.page, filename="my-plots.pdf")

その他のggpubr使用例:http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/81-ggplot2-easy-way-to-mix-multiple-graphs-on-the-same -ページ/

于 2020-04-07T11:04:36.777 に答える
3

これは、 roxygen2のドキュメントと例を含む、Svenのアプローチに基づく関数です。

#' Save list of ggplot2 objects to single pdf
#'
#' @param list (list) List of ggplot2 objects.
#' @param filename (chr) What to call the pdf.
#'
#' @return Invisible NULL.
#' @export
#'
#' @examples
#' #plot histogram of each numeric variable in iris
#' list_iris = map(names(iris[-5]), ~ggplot(iris, aes_string(.)) + geom_histogram())
#' #save to a single pdf
#' GG_save_pdf(list_iris, "test.pdf")
GG_save_pdf = function(list, filename) {
  #start pdf
  pdf(filename)

  #loop
  for (p in list) {
    print(p)
  }

  #end pdf
  dev.off()

  invisible(NULL)
}
于 2018-08-14T17:53:14.210 に答える
0

パッケージなしの素晴らしい解決策gridExtra

library(plyr)
library(ggplot2)

li = structure(p, class = c("gglist", "ggplot"))
print.gglist = function(x, ...) l_ply(x, print, ...)
ggsave(li, file = "test.pdf")
于 2018-05-14T07:56:21.530 に答える