Creazione di un diagramma facet_wrap con ggplot2 con diverse annotazioni in ogni appezzamento

StackOverflow https://stackoverflow.com/questions/2050610

  •  20-09-2019
  •  | 
  •  

Domanda

Sto usando ggplot2 per esplorare il risultato di alcuni test su un modello basato su agenti. Il modello può finire in uno dei tre colpi al realizzazione, e come tale io sono interessato a come giocatore utilities differiscono in termini di ciò che intorno il gioco finisce e la loro posizione relativa nello spazio 2D.

Tutto questo per dire che ho generato un diagramma facet_wrap visualizzare questo per ogni turno, ma vorrebbe anche annotare ogni trama con il cor (x, y) per il sottoinsieme di dati rappresentati in ciascuna sfaccettatura. C'è un modo per dire ggplot2 che vorrei l'annotazione di utilizzare 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
(fonte: drewconway.com )

Come si può vedere, ci sono due problemi:

  1. Il valore \ rho è del dataset completo, piuttosto che i sottoinsiemi di 'round'. C'è un modo per ottenere il cor (x, y) per stampare in base solo i dati riportati in ciascuna trama?
  2. L'annotazione dovrebbe leggere "\ rho = some_value", ma invece io ottenere "= (\ rho, value);" C'è un modo per risolvere questo problema?
È stato utile?

Soluzione

Per risolvere il problema secondo uso

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

vale a dire. "rho==".

Modifica 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)

Altri suggerimenti

La stessa domanda può essere chiesto come per l'aggiunta di segmenti per ogni sfaccettatura. Siamo in grado di risolvere questi problemi generali di geom_segment invece di annotate("segment",...), per il geom_foo, possiamo definire una data.frame per memorizzare i dati per il geom_foo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top