W programie ggplot2
można łatwo zapisać grafikę do obiektu R.
p = ggplot(...) + geom_point() # does not display the graph
p # displays the graph
Funkcja standardowa plot
tworzy grafikę jako funkcję void i zwraca NULL.
p = plot(1:10) # displays the graph
p # NULL
Czy można zapisać grafikę stworzoną przez plot
w obiekcie?
plot
jest typem ogólnym iplot
o ile wiem , różne metody zwracają takie obiekty.plot.default
jednak rzeczywiście powracaNULL
.p
po wpisaniu go jako obiektu? A może chciałbyś go zapisać jako obiekt, który następnie mógłbyś zmienić na przykład jego wartości?Odpowiedzi:
grafika bazowa rysowana bezpośrednio na urządzeniu.
Możesz użyć
1-
recordPlot
2- Niedawno wprowadzony
gridGraphics
pakiet do konwersji grafiki podstawowej do ich odpowiednika w siatceOto minimalny przykład,
plot(1:10) p <- recordPlot() plot.new() ## clean up device p # redraw ## grab the scene as a grid object library(gridGraphics) library(grid) grid.echo() a <- grid.grab() ## draw it, changes optional grid.newpage() a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10)) grid.draw(a)
źródło
saveRDS(object = p, file = "p.Rds")
, a następnie załaduję nową sesję języka R, uruchom,p <- readRDS(file = "p.Rds")
a następniep
pojawi się komunikat o błędzieError in replayPlot(x) : loading snapshot from a different session
. Czyp
niepoprawnie zapisuję obiekt?gridGraphics
pokazanej tutaj metody, kolory na przerysowanym wykresie ciągle się pomieszały, nawet zgrid.grab(wrap=TRUE)
Bardzo się na to spóźniłem, ale było to pierwsze pytanie, które się pojawiło, gdy szukałem tego pytania. Dlatego chciałbym dodać moje rozwiązanie dla przyszłych widzów, którzy napotkają to pytanie.
Rozwiązałem to, używając funkcji zamiast obiektu. Załóżmy na przykład, że chcemy porównać dwa rozkłady beta z różnymi parametrami. Uciekamy:
z1<-rbeta(10000,5,5) z2<-rbeta(10000,20,20) plotit<-function(vector,alpha,beta){ plot(density(vector),xlim=c(0,1)) abline(v=alpha/(alpha+beta),lty="longdash") }
I zapisuj wykresy jako funkcje, a nie obiekty.
z.plot1<-function(){plotit(z1,5,5)} z.plot2<-function(){plotit(z2,20,20)}
Następnie możemy nazwać każdy wykres tak, jak chcemy, po prostu nazywając te dwa wykresy funkcjami, a nie obiektami.
kreśli pierwszą działkę i
kreśli drugą.
Mam nadzieję, że pomoże to komuś, kto natknie się na to później!
źródło
recordPlot
jest zdecydowanie przydatny (jeśli masz już otwarte okno), ale ta odpowiedź jest dokładnie tym, czego szukają ludzie, odwiedzając ten post. +1!Możesz użyć funkcji aktywnego wiązania
pryr
pakietu, jeśli nie chcesz bezpośrednio zmieniać wartości utworzonego obiektu.library(pryr) a %<a-% plot(1:10,1:10)
Za każdym razem, gdy będziesz pisać
a
na konsoli, wykres zostanie ponownie wydrukowany na ekranie.%<a-%
Operator będzie ponownie uruchomić skrypt za każdym razem (w przypadku jednego wykresu To nie jest problem, myślę). Zasadniczo więc za każdym razem, gdy użyjesza
kodu, zostanie uruchomiony ponownie, co spowoduje powstanie wykresu, którym możesz oczywiście manipulować (nałożyć inny wykres na górę) lub zapisać, używającpng
na przykład.a
Jednak żadna sama wartość nie zostanie zapisana . Wartość nadal będzie NULL.Nie wiem, czy powyższe jest tym, czego szukasz, ale może to być akceptowalne rozwiązanie.
źródło
plot(1:10);abline(v=4)
na przykład)? +1a %<a-% {plot(1:10);abline(v=4)}
. ” Jeśli wpiszesz to w tych nawiasach klamrowych, możesz mieć tyle wierszy, ile chcesz! Ponadto, jeśli chcesz ponownie przypisać wartość doa
, musisz ją najpierw usunąć za pomocą,rm(a)
a następnie ponownie przypisać%<a-%
operator inaczej dostaniesz ostrzeżenie nie wiem, dlaczego tak się dzieje, ale myślę, że nie jest to nic wielkiego..%<a-%
. Dzięki%<d-%
też, może się później przydać. Cieszę się, że mogłem być pomocny :)library(ggplot2) # if mygraph is a plot object ggsave("myplot1.png",mygraph) # if the plot is in a list (e.g. created by the Bibliometrics package) ggsave("myplot1.png",mygraphs[[1]])
źródło