Создание графика facet_wrap с помощью ggplot2 с различными аннотациями на каждом графике
Вопрос
Я использую ggplot2 для изучения результатов некоторого тестирования модели, основанной на агентах.Модель может заканчиваться одним из трех раундов за реализацию, и поэтому меня интересует, как утилиты игроков различаются с точки зрения того, каким раундом заканчивается игра, и их относительного положения в 2D пространстве.
Все это означает, что я сгенерировал график facet_wrap, чтобы показать это для каждого раунда, но я также хотел бы пометить каждый график значением cor (x, y) для подмножества данных, представленных в каждом аспекте.Есть ли способ сообщить ggplot2, что я хотел бы, чтобы в аннотации использовалось подмножество данных, сгенерированных facet_wrap?Вот код, который у меня есть на данный момент, и что он производит
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()
(источник: drewconway.com)
Как вы можете видеть, есть две проблемы:
- Значение ho относится к полному набору данных, а не к подмножествам по 'round'.Есть ли способ заставить cor (x, y) выводиться на печать только на основе данных, показанных на каждом графике?
- Аннотация должна гласить " ho=some_value", но вместо этого я получаю "=( ho, значение);" есть ли способ это исправить?
Решение
Чтобы устранить вторую проблему, используйте
annotate("text", 0.375, -1.25,
label=paste("rho==", round(cor(abm.data$area, abm.data$U1_2), 2)),
parse=TRUE)
т. е. "rho=="
.
Редактировать: Вот решение для решения первой проблемы
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)
Другие советы
Может быть задан тот же вопрос, что и при добавлении сегментов для каждой грани.Мы можем решить эти общие проблемы путем geom_segment
вместо того , чтобы annotate("segment",...)
, для geom_foo
, мы можем определить data.frame
для хранения данных для geom_foo
.