2010-01-12 39 views
16

Tôi đang sử dụng ggplot2 để khám phá kết quả của một số thử nghiệm trên mô hình dựa trên tác nhân. Mô hình có thể kết thúc bằng một trong ba vòng cho mỗi lần thực hiện và vì vậy tôi quan tâm đến cách các tiện ích của trình phát khác nhau về vòng kết thúc trò chơi và vị trí tương đối của chúng trong không gian 2D. Tất cả điều này là để nói rằng tôi đã tạo ra một cốt truyện facet_wrap để hiển thị điều này cho mỗi vòng, nhưng tôi cũng muốn chú thích mỗi ô với cor (x, y) cho tập hợp con dữ liệu được biểu diễn trong mỗi khía cạnh. Có cách nào để nói với ggplot2 rằng tôi muốn chú thích sử dụng tập con dữ liệu được tạo bởi facet_wrap? Dưới đây là đoạn code tôi có cho đến nay, và những gì nó được sản xuấtTạo cốt truyện facet_wrap với ggplot2 với các chú thích khác nhau trong mỗi ô

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

Như bạn có thể thấy, có hai vấn đề:

  1. Các \ giá trị rho là của toàn tập dữ liệu, thay vì tập con bằng 'tròn'. Có cách nào để lấy cor (x, y) chỉ in dựa trên dữ liệu được hiển thị trong mỗi ô không?
  2. Chú thích nên đọc "\ rho = some_value" nhưng thay vào đó tôi nhận được "= (\ rho, giá trị);" Có cách nào để sửa lỗi này?

Trả lời

15

Để khắc phục vấn đề thứ hai sử dụng

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

ví dụ "rho==".

Edit: Dưới đây là một giải pháp để giải quyết vấn đề đầu tiên

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

Thay vì 'cbind'ing x và y vào' df.cor', tôi khuyên bạn nên 'geom_text (aes (x = 0, y = 3, label = V1), ...) ' – hadley

+0

Phải, đã sửa. Cảm ơn. – rcs

+0

Xuất sắc, điều này thật hoàn hảo! Tôi đã định quay lại để thêm các giá trị bằng tay qua Inkscape ... – DrewConway

Các vấn đề liên quan