Grid.arrange () çizimini dosyaya kaydetme


138

Kullanarak ggplot2düzenleyerek kullanarak birden fazla parsel çizmeye çalışıyorum grid.arrange(). Sahip olduğum tam sorunu açıklayan birini bulmayı başardığım için, bağlantı açıklamasından linkten alıntı yaptım :

Ben kullandığınızda ggsave()sonra grid.arrange(), yani

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

Izgara grafiğini değil, son bireysel ggplot'u kaydediyorum. Grafiği grid.arrange()kullanarak ggsave()veya benzeri bir şeyle gösterildiği gibi kaydetmenin herhangi bir yolu var mı ? Eski yolu kullanmak dışında

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

Aynı bağlantı aşağıdaki çözümü verir:

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

Ancak, çağrının ggsave()çıktısını bağlantıdangrid.arrange() alınan aşağıdaki kodda kaydetmek için nasıl kullanılacağını anlayamıyorum :

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()?

6
Kullanımpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
Değil print(ggplot())mi?
IRTFM

@DWin Evet, muhtemelen! :-)
Andrie

1
@Andrie Önerdiğiniz şey işe yarıyor, ancak görüntünün çözünürlüğü çok düşük. ggplotKullanarak tek bir kaydettiğimde ggsave(), görüntünün çözünürlüğü çok daha yüksek olur. Çıktısını grid.arrange()yüksek bir çözünürlükle kaydetmenin bir yolu var mı ggsave()? Örneğin seçenekleri sağlarsam png(...,height=1600, width=2500)görüntü çok bulanık görünür.
I Like Kodu

Yanıtlar:


142

grid.arrangedoğrudan bir cihaza çizer. arrangeGrobÖte yandan, herhangi bir şey çizmek yok ama bir Grob döndürür gsen geçebileceğini, ggsave(file="whatever.pdf", g).

Varsayılan olarak belirtilmemişse son çizimin kaydedildiği ggplot nesnelerine göre farklı çalışmasının nedeni, ggplot2'nin görünmez bir şekilde en son çizimi izlemesidir ve grid.arrangebu sayacı pakete özel olarak karıştırması gerektiğini düşünmüyorum .


3
Bunu denediğimde bana doğru tipte olmadığını söyleyen bir hata alıyorum?
Jack Aidley

@JackAidley minimum bağımsız bir tekrarlanabilir örnek ve sessionInfo () ile yeni bir soru sormak (R ve paketlerin son sürümlerine sahip olduğunuzdan emin olun).
baptiste

3
@DaveX lütfen bu yanıltıcı bilgiyi yaymayın; plot(g)olduğu değil bir gtable, kullanımını göstermek için doğru yolu grid.draw(g)yerine.
vaftiz

@baptiste Teşekkürler & yeniden bir çalışma: Gördüğünüz çalışırsanız sonucu olduğunu Not g <-arrangeGrob(...)ile print(g)size grafiği listeleyen bir metin tablo elde grafik yerine itiraz ediyor. grid.draw(g)Grafiği grafik olarak oluşturmaya çalışın . -
Dave X

7
ggsave artık (bazı veya tüm) grobs ile çalışmıyor.
vak

47

Babptiste'nin önerisiyle ilgili bazı problemlerim vardı, ama sonunda anladım. İşte kullanmanız gerekenler:

 # 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

Bu iyi olmalı.


25

Bir grid.arrange dosyasını pdf dosyasına kaydetmenin başka bir kolay yolu pdf () kullanmaktır:

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

Tablodaki ggplotlardan başka şeylerin birleştirilmesine izin verir, tablolar gibi ...


7

Buna eklemeye değdiğini düşündüm. Yukarıdakilerle ilgili sorunlar yaşadım, ggsave bir hata üretti: "arsa bir ggplot2 arsa olmalı"

Bu cevap sayesinde: ggplot_build ve ggplot_gtable kullandıktan sonra bir grafik ggsave ile kaydetme Yukarıdaki kodda bir değişiklik var.

  # 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]

Hatayı düzeltmek için yukarıdaki satır gerekiyordu

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

Şimdi benim için çalışıyor.


Buna ihtiyacım vardı. Görünüşe göre ggplot2'nin geliştirme sürümü, sınıf-test hatasını böyle kaldırır, ancak şu anda CRAN sürümü (2015-10-21) yapmaz.
Dave X

2
Bu benim için marrangeGrob ile çalışıyor, ancak arrangeGrob veya grid.arrange ile çalışmıyor. Teşekkürler!
k13

3

ArrangeGrob kullanmanıza gerek yoktur, grid'in sonucunu doğrudan bir grafiğe atayabilir ve bunu ggsave kullanarak kaydedebilirsiniz:

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

2

Başka bir basit çözüm: grid.arrange()

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

sen yap dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.