Menyimpan plot grid.arrange () ke file

141

Saya mencoba untuk merencanakan beberapa plot menggunakan ggplot2, mengaturnya menggunakan grid.arrange(). Karena saya berhasil menemukan seseorang yang menjelaskan masalah sebenarnya yang saya miliki, saya telah mengutip dari deskripsi masalah dari tautan :

Ketika saya menggunakan ggsave()setelah grid.arrange(), yaitu

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

Saya tidak menyimpan plot grid tetapi ggplot individu terakhir. Apakah ada cara untuk benar-benar menyimpan plot seperti yang ditampilkan dengan grid.arrange()menggunakan ggsave()atau yang serupa? Selain menggunakan cara lama

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

Tautan yang sama memberikan solusi di bawah ini:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

Namun, saya tidak tahu cara menggunakan ggsave()untuk menyimpan output grid.arrange()panggilan dalam kode berikut, yang diambil dari tautan :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?
Saya Suka Kode
sumber
6
Gunakanpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie
2
Tidak print(ggplot())?
IRTFM
@DWin Ya, mungkin! :-)
Andrie
1
@Andrie Apa yang Anda sarankan berfungsi, tetapi resolusi gambar sangat rendah. Ketika saya menyimpan satu ggplotpenggunaan ggsave(), resolusi gambar jauh lebih tinggi. Apakah ada cara untuk menyimpan output grid.arrange()dengan resolusi tinggi, seperti jika itu adalah satu plot yang disimpan ggsave()? Jika saya berikan misalnya opsi png(...,height=1600, width=2500)gambar terlihat sangat buram.
Saya Suka Kode

Jawaban:

149

grid.arrangemenggambar langsung di perangkat. arrangeGrob, di sisi lain, tidak menggambar apa pun kecuali mengembalikan grob g, yang bisa Anda lewati ggsave(file="whatever.pdf", g).

Alasan kerjanya berbeda dari pada objek ggplot, di mana secara default plot terakhir disimpan jika tidak ditentukan, adalah bahwa ggplot2 secara tidak terlihat melacak plot terbaru, dan saya tidak berpikir grid.arrangeharus mengacaukan penghitung ini secara pribadi ke paket.

baptiste
sumber
3
Ketika saya mencoba ini, saya mendapatkan kesalahan yang memberi tahu saya bahwa g bukan tipe yang benar?
Jack Aidley
@JackAidley mengajukan pertanyaan baru, dengan contoh mandiri minimum yang dapat direproduksi, dan sessionInfo () Anda (pastikan Anda memiliki versi R dan paket terbaru).
baptiste
3
@DaveX tolong jangan menyebarkan informasi yang menyesatkan ini; plot(g)adalah tidak dengan cara yang benar untuk menampilkan gtable, penggunaan grid.draw(g)sebagai gantinya.
baptiste
@baptiste Terima kasih & dikerjakan ulang: Perhatikan bahwa jika Anda mencoba untuk melihat hasil dari g <-arrangeGrob(...)with print(g)Anda mendapatkan tabel teks yang mencantumkan objek grafik daripada grafik. Cobalah grid.draw(g)untuk membuat grafik sebagai grafik. -
Dave X
7
ggsave tidak lagi bekerja dengan (beberapa atau semua) grobs.
vak
49

Saya memiliki beberapa masalah dengan proposal babptiste, tetapi akhirnya saya mendapatkannya. Inilah yang harus Anda gunakan:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Ini seharusnya bekerja dengan baik.

user2B4L2
sumber
25

Cara lain yang mudah untuk menyimpan grid.arrange ke file pdf adalah dengan menggunakan pdf ():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

Ini memungkinkan untuk menggabungkan hal-hal lain selain ggplots dalam pengaturan, seperti tabel ...

JohnBee
sumber
7

Saya pikir itu layak untuk ditambahkan. Saya mengalami masalah dengan hal di atas, dengan ggsave menghasilkan kesalahan: "plot harus menjadi plot ggplot2"

Berkat jawaban ini: Menyimpan grafik dengan ggsave setelah menggunakan ggplot_build dan ggplot_gtable Saya memiliki perubahan pada kode di atas.

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

Baris di atas diperlukan untuk memperbaiki kesalahan

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Sekarang bekerja dengan baik untuk saya.

docjg
sumber
Saya membutuhkan ini. Rupanya versi pengembangan ggplot2 menghapus kesalahan uji kelas seperti ini, tetapi versi CRAN saat ini (2015-10-21) tidak.
Dave X
2
Ini berfungsi dengan marrangeGrob untuk saya tetapi tidak dengan arrangeGrob atau grid.arrange. @ DaveX, apakah Anda perlu melakukan hal lain untuk membuatnya berfungsi selain memodifikasi ggsave seperti yang ditunjukkan di atas? Terima kasih!
k13
5

Anda tidak perlu menggunakan ArrangeGrob, Anda dapat menetapkan hasil grid.arrange langsung ke plot dan menyimpannya menggunakan ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)
RegressionSquirrel
sumber
2

Solusi sederhana lainnya: setelah Anda grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

Anda melakukan a dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
TeYaP
sumber
1

coba ini

ggsave("whatever.png", plot=grid.arrange(plot1, plot2, plot3, nrow=3), device=..., scale = ..., width =..., height = ..., units = "...", dpi = ...)
Jakhongir Alidjanov
sumber