2009-08-21 17 views
18

Eksperymentowałem zarówno z ggplot2 i lattice w celu graficznego tworzenia paneli danych. Mam problemy z zawijaniem umysłu wokół modelu ggplot2. W szczególności, w jaki sposób mogę wykreślić wykres punktowy z dwóch zestawów danych na każdym panelu:wykreśla dwa wektory danych na wykresie rozproszonym GGPLOT2 przy użyciu R

w lattice mogę to zrobić:

xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd) 

i że da mi panel dla każdego State_CD z każdej kolumny

mogę zrobić jedną kolumnę z ggplot2:

pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) 
     + facet_wrap(~ State_CD) + opts(aspect.ratio = 1) 
print(pg) 

nie mogę grok jest jak dodać Actual_value do ggplot powyżej.

EDYCJA Hadley zaznaczył, że to naprawdę będzie łatwiejsze z powtarzalnym przykładem. Oto kod, który wydaje się działać. Czy istnieje lepszy lub bardziej zwięzły sposób na zrobienie tego za pomocą ggplot? Dlaczego składnia do dodania innego zestawu punktów do ggplota jest tak różna od dodawania pierwszego zestawu danych?

wyjście
library(lattice) 
library(ggplot2) 

#make some example data 
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24))) 
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD") 

#plot with lattice 
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd) 

#plot with ggplot 
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1) 
print(pg) 

pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

Krata wygląda następująco: alt text http://www.cerebralmastication.com/wp-content/uploads/2009/08/lattice.png

i ggplot wygląda następująco: alt text http://www.cerebralmastication.com/wp-content/uploads/2009/08/ggplot.png

+0

Byłoby znacznie łatwiej zaoferować sugestie, jeśli dostarczono powtarzalny przykład – hadley

+0

tak, to dobra uwaga. Byłem leniwy, nie mogąc stworzyć pełnego przykładu. Spróbuję trochę popracować. –

Odpowiedz

19

Podążając za wskazówkami Iana: w przypadku ggplot2 naprawdę chcesz, aby wszystkie elementy osi y były umieszczone w jednej kolumnie z inną kolumną, co jest czynnikiem wskazującym, w jaki sposób chcesz ją udekorować. Łatwo to zrobić z melt. Słownie:

qplot(x_value, value, 
     data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")), 
     colour=variable) + facet_wrap(~State_CD) 

Oto jak to wygląda dla mnie: alt text http://www.cs.princeton.edu/~jcone/example.png

aby zorientować się, co melt jest rzeczywiście robi, tutaj jest głowa:

> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value"))) 
    x_value State_CD  variable  value 
1 1.2898779  A Predicted_value 1.0913712 
2 0.1077710  A Predicted_value -2.2337188 
3 -0.9430190  A Predicted_value 1.1409515 
4 0.3698614  A Predicted_value -1.8260033 
5 -0.3949606  A Predicted_value -0.3102753 
6 -0.1275037  A Predicted_value -1.2945864 

widzisz, "topi" Predicted_value i Actual_value w jednej kolumnie o nazwie value i dodaje kolejną kolumnę o nazwie variable informującą, z której kolumny pochodzi.

1

dobrze po zaksięgowaniu pytanie natknąłem this R Help thread, które mogły mi pomógł. Wygląda na to, że mogę to zrobić:

pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

czy to dobry sposób na robienie rzeczy? To dziwne, ponieważ dodanie drugiego elementu ma zupełnie inną składnię niż pierwsza.

+0

Pamiętaj, że musisz tylko zmienić ustawienia domyślne, które ustawiłeś w części ggplot(). W twoim przypadku musisz tylko ustawić nową wartość y i kolor. ggplot (dd, aes (x = x_value, y = przewidywana_wartość)) + geom_point (shape = 2) + facet_wrap (~ State_CD) + opts (aspect.ratio = 1) + geom_line (aes (wartość_wartość, kolor = "zielony") ") – Thierry

2

możesz po prostu chcieć nieco zmienić formę swoich danych, tak, że masz jedną zmienną osi y, z dodatkową zmienną czynnikową wskazującą, czy jest to przewidywana czy rzeczywista zmienna.

Czy jest to coś, co próbujesz zrobić?

dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40), 
       x_value=rnorm(40),State_CD=rnorm(40)>0) 
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD) 
+0

ahhh .. Myślę, że to właśnie robią przykłady w dokumentach ggplota, co z pewnością pomaga mi myśleć –

6

Aktualizacja: kilka lat na teraz, prawie zawsze stosować metodę Jonathana (poprzez tidyr package) z ggplot2. Moja odpowiedź poniżej działa w skrócie, ale szybko staje się nużąca, gdy masz 3 + zmienne.


Jestem pewien Hadley będzie miał lepszą odpowiedź, ale - składnia jest inna, ponieważ składnia ggplot(dd,aes()) jest (chyba) przeznaczony głównie do kreślenia tylko jedną zmienną. Dla dwóch, chciałbym używać:

ggplot() + 
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") + 
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) + 
facet_wrap(~ State_CD) + 
theme(aspect.ratio = 1) 

Ciągnięcie pierwszy komplet punktów z ggplot() daje mu taką samą składnię jako drugi. Łatwiej mi się z tym uporać, ponieważ składnia jest taka sama i podkreśla "Gramatyka grafiki", która jest rdzeniem ggplot2.

+0

@MichaelChirico Rzeczywiście,' aspect.ratio' jest teraz w funkcji 'theme()'. Odpowiedź została zaktualizowana - dzięki za wskazując to. –