Criando um gráfico FACET_WRAP com GGPlot2 com diferentes anotações em cada gráfico

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Estou usando o GGPlot2 para explorar o resultado de alguns testes em um modelo baseado em agente. O modelo pode terminar em uma das três rodadas por realização e, como tal, estou interessado em como os utilitários dos jogadores diferem em termos do que o jogo termina e sua posição relativa no espaço 2D.

Tudo isso é dizer que eu gerei um gráfico FACET_WRAP para mostrar isso para cada rodada, mas também gostaria de anotar cada gráfico com o cor (x, y) para o subconjunto de dados representados em cada faceta. Existe uma maneira de dizer ao GGPlot2 que eu gostaria da anotação para usar o subconjunto de dados gerados pelo FACET_WRAP? Aqui está o código que tenho até agora e o que está produzindo

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)

Como você pode ver, existem dois problemas:

  1. O valor rho é do conjunto de dados completo, em vez dos subconjuntos por 'rodada'. Existe uma maneira de fazer com que o cor (x, y) imprima com base apenas nos dados mostrados em cada gráfico?
  2. A anotação deve ler " rho = algum_Value", mas, em vez disso, eu recebo "= ( rho, valor);" Existe uma maneira de corrigir isso?
Foi útil?

Solução

Para corrigir o segundo problema de uso

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

ou seja "rho==".

Editar: Aqui está uma solução para resolver o primeiro 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)

Outras dicas

A mesma pergunta pode ser feita como adicionar segmentos para cada faceta. Podemos resolver esses problemas gerais por geom_segment ao invés de annotate("segment",...), para o geom_foo, podemos definir um data.frame Para armazenar os dados para o geom_foo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top