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ś, kto dokładnie opisałby mój problem, zacytowałem z opisu problemu z linku :
Kiedy używam ggsave()
po grid.arrange()
tj
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) ggsave("sgcirNIR.jpg")
Nie zapisuję wykresu siatki, ale ostatni indywidualny ggplot. Czy istnieje sposób na zapisanie wyświetlanego wykresu za grid.arrange()
pomocą
ggsave()
lub czegoś podobnego? Inaczej niż starszym sposobem
jpeg("sgcirNIR.jpg") grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2) dev.off()
Ten sam link daje poniższe rozwiązanie:
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 mogę dowiedzieć się, jak użyć ggsave()
do zapisania danych wyjściowych grid.arrange()
wywołania w poniższym kodzie, który jest pobierany z linku :
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()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
użycieggsave()
, rozdzielczość obrazu jest znacznie wyższa. Czy istnieje sposób na zapisanie wyjściagrid.arrange()
z wysoką rozdzielczością, tak jakby to był zapisany pojedynczy wykresggsave()
? Jeśli podam na przykład opcje,png(...,height=1600, width=2500)
obraz wygląda na bardzo rozmyty.Odpowiedzi:
grid.arrange
rysuje bezpośrednio na urządzeniu.arrangeGrob
z drugiej strony niczego nie rysuje, ale zwraca grobg
, do którego możesz przejśćggsave(file="whatever.pdf", g)
.Powodem, dla którego działa inaczej niż w przypadku obiektów ggplot, w których domyślnie zapisywany jest ostatni wykres, jeśli nie jest określony, jest to, że ggplot2 niewidocznie śledzi najnowszy wykres i nie sądzę, że
grid.arrange
powinien zadzierać z tym licznikiem prywatnym dla pakietu.źródło
plot(g)
jest właściwym sposobem wyświetlania gtable, użyj zamiast tego.grid.draw(g)
g <-arrangeGrob(...)
zprint(g)
, otrzymasz tabelę tekstową zawierającą obiekty graficzne, a nie grafikę. Spróbujgrid.draw(g)
renderować grafikę jako grafikę. -Miałem problemy z propozycją babptiste, ale w końcu udało mi się. Oto, czego powinieneś użyć:
To powinno działać dobrze.
źródło
Innym prostym sposobem zapisania grid.arrange do pliku pdf jest użycie pdf ():
Pozwala łączyć w aranżację inne rzeczy niż ggplots, np. Tabele ...
źródło
Pomyślałem, że warto do tego dodać. Miałem problemy z powyższym, ggsave generował błąd: "wykres powinien być wykresem ggplot2"
Dzięki tej odpowiedzi: Zapisując wykres z ggsave po użyciu ggplot_build i ggplot_gtable mam poprawkę do powyższego kodu.
Powyższa linia wymagała naprawy błędu
Teraz działa na mnie dobrze.
źródło
Nie ma potrzeby korzystania z programurangeGrob, można przypisać wynik działania grid.arrange bezpośrednio do wykresu i zapisać go za pomocą ggsave:
źródło
Kolejne proste rozwiązanie: zaraz po Twoim
grid.arrange()
robisz
dev.copy()
źródło