2010-01-12 13 views
16

Sto utilizzando ggplot2 per esplorare il risultato di alcuni test su un modello basato su agente. Il modello può terminare in uno dei tre round per realizzazione, e come tale sono interessato a come le utilità dei giocatori differiscono in termini di cosa termina il gioco e della loro posizione relativa nello spazio 2D.Creazione di un complimento facet_wrap con ggplot2 con annotazioni diverse in ciascun grafico

Tutto questo per dire che ho generato un grafico facet_wrap per mostrare questo per ogni round, ma vorrei anche annotare ogni grafico con il cor (x, y) per il sottoinsieme di dati rappresentati in ogni facet. C'è un modo per dire a ggplot2 che vorrei che l'annotazione usasse il sottoinsieme di dati generati da facet_wrap? Ecco il codice che ho finora, e ciò che sta producendo

library(ggplot2) 

# Load data 
abm.data<-read.csv("ABM_results.csv") 

# Create new colun for area of Pareto set 
attach(abm.data) 
area<-abs(((x3*(y2-y1))+(x2*(y1-y3))+(x1*(y3-y2)))/2) 
abm.data<-transform(abm.data,area=area) 
detach(abm.data) 

# Compare area of Pareto set with player utility 
png("area_p1.png",res=100,pointsize=20,height=500,width=1600) 
area.p1<-ggplot(abm.data,aes(x=area))+geom_point(aes(y=U1_2,colour="Player 1",alpha=0.4))+facet_wrap(~round,ncol=3)+ 
    annotate("text",0.375,-1.25,label=paste("rho=",round(cor(abm.data$area,abm.data$U1_2),2)), parse=TRUE)+ 
    scale_colour_manual(values=c("Player 1"="red")) 
area.p1+xlab("Area of Pareto Set")+ylab("Player Utility at Game End")+ 
    opts(title="Final Player 1 Utility by Pareto Set Size and Round Game Ends",legend.position="none") 
dev.off() 

area_p1 http://www.drewconway.com/zia/wp-content/uploads/2010/01/area_p1.png

Come si può vedere, ci sono due problemi: il valore

  1. L'\ rho è del pieno set di dati, piuttosto che i sottoinsiemi di "round". C'è un modo per ottenere il cor (x, y) da stampare basandosi solo sui dati mostrati in ogni trama?
  2. L'annotazione dovrebbe leggere "\ rho = valore_ausuale", ma invece ricevo "= (\ rho, valore);" C'è un modo per risolvere questo problema?

risposta

15

Per fissare utilizzare il secondo problema

annotate("text", 0.375, -1.25, 
     label=paste("rho==", round(cor(abm.data$area, abm.data$U1_2), 2)), 
     parse=TRUE) 

cioè "rho==".

Edit: Ecco una soluzione per risolvere il primo problema

library("plyr") 
library("ggplot2") 

set.seed(1) 
df <- data.frame(x=rnorm(300), y=rnorm(300), cl=gl(3,100)) # create test data 
df.cor <- ddply(df, .(cl), function(val) sprintf("rho==%.2f", cor(val$x, val$y))) 

p1 <- ggplot(data=df, aes(x=x)) + 
      geom_point(aes(y=y, colour="col1", alpha=0.4)) + 
      facet_wrap(~ cl, ncol=3) + 
      geom_text(data=df.cor, aes(x=0, y=3, label=V1), parse=TRUE) + 
      scale_colour_manual(values=c("col1"="red")) + 
      opts(legend.position="none") 
print(p1) 
+2

Invece di 'cbind'ing xey in' df.cor', vi consiglio 'geom_text (AES (x = 0, y = 3, label = V1), ...) ' – hadley

+0

Destra, risolto. Grazie. – rcs

+0

Eccezionale, è perfetto! Stavo per tornare ad aggiungere i valori a mano tramite Inkscape ... – DrewConway

Problemi correlati