2015-04-11 19 views
42

W ggplot2 można łatwo zapisać grafikę w obiekcie R.Zapisywanie działki w obiekcie

p = ggplot(...) + geom_point()  # does not display the graph 
p         # displays the graph 

Standardowa funkcja plot produkuje grafikę jako funkcję void i zwraca NULL.

p = plot(1:10)  # displays the graph 
p     # NULL 

Czy to możliwe, aby zapisać grafikę stworzoną przez plot w obiekcie?

+0

'Spisek' jest ogólny, a różne metody "fabuły" zwracają takie obiekty, o ile wiem. 'plot.default', jednak zwraca' NULL'. –

+0

Czy Twoim celem jest możliwość zastąpienia wykresu tylko po wpisaniu 'p' po zapisaniu go jako obiektu? A może chciałbyś zapisać go jako obiekt, który na przykład byłby w stanie zmienić jego wartości? – LyzandeR

+0

Może chciałbym nakładać inne grafiki na zapisaną grafikę, ale nie zamierzam modyfikować utworzonego i zapisanego wydruku. Czy odpowiedziałem na twoje pytanie? Thks –

Odpowiedz

49

Podstawowa grafika narysowana bezpośrednio na urządzeniu.

Można użyć

1- recordPlot

2- niedawno wprowadzony gridGraphics package, konwertować grafiki bazowe do ich sieci równoważnej

Oto 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) 
+0

Nie jest dla mnie jasne: czy są (1) i (2) oddzielne metody dla osiągnięcia tego samego celu, czy też dwa kroki, które są niezbędne, aby odpowiedzieć na pytanie PO? – NLi10Me

+0

@ NLi10Me 2 różne metody. – zx8754

11

You może korzystać z aktywnej funkcji wiązania pakietu pryr, jeśli nie chcesz bezpośrednio zmienić wartości utworzonego obiektu.

library(pryr) 
a %<a-% plot(1:10,1:10) 

każdym razem wpisać a na konsoli wykres będzie przedrukowany na ekranie. Operator %<a-% ponownie uruchomi skrypt za każdym razem (w przypadku jednego wykresu to nie jest problem, jak sądzę). Zasadniczo za każdym razem, gdy użyjesz a, kod zostanie ponownie uruchomiony, co spowoduje powstanie wykresu, który oczywiście możesz manipulować (nakładanie kolejnego wykresu na wierzchu) lub zapisywać przy użyciu na przykład png. Jednak sama wartość nie będzie przechowywana w a. Wartość będzie nadal mieć wartość NULL.

Nie wiem, czy powyższe jest to, czego szukasz, ale może to być dopuszczalne rozwiązanie.

+0

Dziękuję. To bardzo przydatne rozwiązanie. Czy wiesz, czy to działa, jeśli wykres jest budowany przez kilka linii (na przykład 'plot (1:10), abline (v = 4)' na przykład? +1 –

+0

@ Remi.b Tak, oczywiście, że tak. Musisz go wpisać tak: "a% LyzandeR

+0

To jest naprawdę fajne! Będę musiał przeczytać trochę na temat tego pakietu, ponieważ brzmi to niemożliwe dla mnie, aby zrobić to, co ta dziwna funkcja '%

4

Spóźniam się na to, ale było to pierwsze pytanie, które pojawiło się, gdy szukałem pytania. Chciałbym dodać moje rozwiązanie dla przyszłych widzów, którzy natrafiają na to pytanie.

Rozwiązałem to, używając funkcji zamiast obiektu. Załóżmy na przykład, że chcemy porównać dwie dystrybucje beta o różnych parametrach. Możemy uruchomić:

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 zapisać wykresy jak funkcji zamiast obiektów.

z.plot1<-function(){plotit(z1,5,5)} 
z.plot2<-function(){plotit(z2,20,20)} 

Następnie możemy wywołać każdy wykres tak, jak chcemy, po prostu wywołując dwa wykresy jako funkcje, a nie obiekty.

z.plot1() 

Działki pierwsza fabuły i

z.plot2() 

Działki drugiego.

Mam nadzieję, że pomoże komuś, kto potknie się o to później!