od czasu, gdy czytałem dużo podobnych pytań na stackoverflow, nie mogłem znaleźć dobrego rozwiązania bez aktualizacji ggplot2 do wersji rozwojowej.używając ggsave i arranGrob po aktualizacji gridExtra do 2.0.0
Mój problem, mam kilka skryptów, które używają arrangeGrob
do tworzenia połączonego wykresu z pojedynczych wykresów. Zapisuję je w zmiennej i print
tej zmiennej i/lub zapisuję ją za pomocą ggsave
. Ponieważ wielu moich kolegów regularnie aktualizuje paczki (co jest dobre, myślę), zawsze otrzymuję maile, że mój skrypt przestał działać po aktualizacji do gridExtra 2.0.0
.
Nie jestem pewien, jak sobie z tym poradzić, ponieważ nowa wersja ggplot2
, w której problem został rozwiązany, jest wciąż rozwijana. Znalazłem article na przepełnienie stosu, aby usunąć test, jeśli obiekt, aby zapisać to ggplot
od nowa arrangeGrob
funkcja zwraca gtable
obiekt, ale to nie w moim przypadku:
library(ggplot2)
library(grid)
library(gridExtra)
a <- data.frame(x=c(1,2,3),
y=c(2,3,4))
p <- ggplot(a, aes(x, y)) + geom_point()
b <- arrangeGrob(p, p)
grid.draw(b)
ggsave('test.pdf', b)
ggsave <- ggplot2::ggsave
body(ggsave) <- body(ggplot2::ggsave)[-2]
ggsave('test.pdf', b)
Niektóre wyjścia i błędów na konsoli :
d> grid.draw(b)
d> ggsave('test.pdf', b)
Error in ggsave("test.pdf", b) : plot should be a ggplot2 plot
d> ggsave <- ggplot2::ggsave
d> body(ggsave) <- body(ggplot2::ggsave)[-2]
d> ggsave('test.pdf', b)
Saving 10.5 x 10.7 in image
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
d>
test.pdf
jest tworzony, ale jest on uszkodzony w jakikolwiek sposób i nie mogą być otwierane. Również obiekt gtable
zostanie wydrukowany. Więc myślę, że coś jest nie tak.
Ale, jak widać, znalazłem w przykładowym kodzie, znalazłem funkcję grid.draw
, aby wykreślić co najmniej mój połączony wykres, ale nadal nie mogę ggsave
go po modyfikacji.
Nie chcę używać "starych" (pdf(file = "test.pdf"); grid.draw(b); dev.off()
) funkcji oszczędzania urządzeń zgodnie z sugestiami podanymi w this article, ponieważ są one bardzo niewygodne w użyciu.
W this question ktoś zapytał dokładnie jak zapisać obiektu, ale w odpowiedzi po prostu wyjaśnić użycie grid.darw
i przyjął odpowiedź jako solving the problem
i nikt nie odpowiedział na moje komentarze do tej pory.
Więc jestem całkiem zagubiony w tej chwili, jak zapewnić obsługę skryptów dla tych, którzy mają i nie zaktualizowali do nowego pakietu gridExtra
. Sposób na usunięcie testu w ramach funkcji ggsave
jest chyba najlepszym rozwiązaniem, ponieważ mogę sprawdzić wersję gridExtra
i ggplot2
i po prostu zastąpić funkcję ggsave
na wypadek, gdyby wersja nie pasowała, ale nie mogłem jej uruchomić.
Czekamy na pomoc.
EDIT:
Może sessionInfo
pomaga
d> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.9.5 (Mavericks)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] gridExtra_2.0.0 ggplot2_1.0.1
loaded via a namespace (and not attached):
[1] Rcpp_0.12.1 digest_0.6.8 MASS_7.3-44 plyr_1.8.3 gtable_0.1.2
[6] magrittr_1.5 scales_0.3.0 stringi_1.0-1 reshape2_1.4.1 devtools_1.9.1
[11] proto_0.3-10 tools_3.2.0 stringr_1.0.0 munsell_0.4.2 colorspace_1.2-6
[16] memoise_0.2.1
Próbowałeś użyć PDF() zamiast ggsave? Coś w tym stylu: pdf (file = "test.pdf"); grid.newpage(); print (b); dev.off() – YCR
Ten link może pomóc: http://alstatr.blogspot.co.uk/2015/02/r-how-to-layout-and-design- infographic.html – YCR
@YCR to jest to, o czym wspomniałem z drugim linkiem. Wiem, że to działa, ale jest bardzo niefortunne. Chciałbym, aby funkcja 'ggsave' działała zgodnie z sugestią w pierwszym linku, ponieważ w przeciwnym razie muszę zmienić wiele linii w moich skryptach ... – drmariod