2013-06-12 20 views
90

Próbuję wykreślić wiele działek za pomocą ggplot2, układając je za pomocą grid.arrange(). Ponieważ udało mi się znaleźć kogoś, opisujący dokładnie problem mam, mam cytat z opisu problemu z link:Zapisywanie grid.arrange() działki do pliku

Gdy używam ggsave() po grid.arrange(), tj

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

nie zapisać wykres siatki ale ostatni indywidualny ggplot. Czy jest jakiś sposób na zapisanie wykresu w sposób przedstawiony przez grid.arrange() przy użyciu ggsave() lub czegoś podobnego? Inny niż przy użyciu starszych sposób

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

tym samym łączu daje rozwiązanie poniżej:

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 

Jednak nie można dowiedzieć się, jak korzystać z ggsave() zapisać wyjście rozmowy grid.arrange() w ten kod, który jest pobierany z link:

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

Użyj 'png(); grid.arrange(); ggplot(); ggplot(); dev.off() ' – Andrie

+1

Nie' print (ggplot()) '? –

+0

@DWin Tak, prawdopodobnie!:-) – Andrie

Odpowiedz

91

grid.arrange przyciąga bezpośrednio na część urządzenie. arrangeGrob, z drugiej strony, nie rysuje niczego, ale zwraca grob g, który można przekazać do ggsave(file="whatever.pdf", g).

Powód, dla którego działa inaczej niż w przypadku obiektów ggplot, gdzie domyślnie zapisywany jest ostatni wykres, jeśli nie jest określony, jest to, że ggplot2 w niewidoczny sposób śledzi najnowszy wątek, i nie sądzę, że grid.arrange powinien zadzwonić z tym kontuarem prywatny do pakietu.

+0

Dzięki! Właśnie tego szukałem. –

+1

Kiedy próbuję tego, pojawia się błąd informujący mnie, że g nie jest odpowiedniego typu? –

+0

@JackAidley zadaj nowe pytanie z minimalnym samodzielnym odtwarzalnym przykładem i twoją sessionInfo() (upewnij się, że masz najnowsze wersje R i pakietów). – baptiste

24

Miałem pewne problemy z propozycją babptiste, ale w końcu ją otrzymałem. Oto, co powinieneś użyć:

# 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 

To powinno działać poprawnie.

4

Pomyślałem, że warto to dodać. miałem problemy z powyższym, z ggsave wytwarzania błąd: „działka powinna być działka ggplot2”

Dzięki tej odpowiedzi: Saving a graph with ggsave after using ggplot_build and ggplot_gtable Mam poprawkę do powyższego kodu.

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

Powyższa linia potrzebne, aby naprawić ten błąd

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

Teraz pracuje dla mnie w porządku.

+0

Potrzebowałem tego. Wygląda na to, że wersja rozwojowa ggplot2 usuwa taki błąd testu-klasy, ale obecnie wersja CRAN (2015-10-21) tego nie robi. –

+2

Działa to z marrangeGrob dla mnie, ale nie z arranGrob lub grid.arrange. @ DaveX, czy musisz zrobić cokolwiek innego, aby to działało oprócz modyfikowania ggaveave, jak pokazano powyżej? Dzięki! – k13

14

Kolejny łatwy sposób zapisać grid.arrange do pliku pdf jest użycie 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 

Pozwala to połączyć inne rzeczy niż ggplots w układzie, jak stoły ...