2012-04-14 22 views
11

Tôi đang cố gắng sao chép ví dụ của Hadley Wickham trên trang 86 của sách ggplot2, nơi ông xếp lớp địa lý cho thấy bên nắm quyền xu hướng thất nghiệp. Đây là mã cốt lõi của tôi, với một số dữ liệu mẫu:lỗi geom_rect: Lỗi trong eval (expr, envir, enclos): đối tượng 'biến' không tìm thấy

library("ggplot2") 
library("reshape2") 
library("lubridate") 

con <- textConnection("Date,Var1,Var2 
8-Jan-12,100.8,116 
15-Jan-12,99.4,115.5 
22-Jan-12,98.4,115 
28-Jan-12,97.1,114 
4-Feb-12,95.9,112 
11-Feb-12,95.3,113 
18-Feb-12,93.9,111.5 
25-Feb-12,93.5,111.5 
3-Mar-12,92.6,110 
10-Mar-12,91.4,108 
17-Mar-12,90.2,106.8 
24-Mar-12,90,107.5 
31-Mar-12,89.9,106 
5-Apr-12,90.4,106.5 
12-Apr-12,89.8,106") 

track <- read.csv(con, header=TRUE) 
track$Date <- as.Date(dmy(track$Date)) 

track <- melt(track, 
      id.vars = c("Date")) 

con <- textConnection("City,From,To 
Auckland,5-Apr-12,10-Apr-12 
Brussels,1-Apr-12,3-Apr-12 
Cleveland,24-Jan-12,26-Jan-12 
Darjeeling,18-Jan-12,19-Jan-12 
Erehwon,8-Feb-12,10-Feb-12 
Florence,5-Mar-12,7-Mar-12 
Gandalf,25-Mar-12,27-Mar-12") 

trips <- read.csv(con, header=TRUE) 
trips$From <- as.Date(dmy(trips$From)) 
trips$To <- as.Date(dmy(trips$To)) 

# draw the Time Series data 
p <- ggplot(track, 
      aes(x = Date, 
       y = value, 
       colour=variable, 
       group = variable)) 
p <- p + geom_smooth() 
p <- p + geom_point(size=3) 
p <- p + geom_vline(data=trips, 
        aes(xintercept=From), 
        colour='steelblue') # departure dates 
p <- p + geom_vline(data=trips, 
        aes(xintercept=To), 
        colour='grey80') # return dates 
yrng <- c(80,120) 
p <- p + scale_y_continuous(limits=yrng) 

p # this works up to here, using vlines (ugly, but makes the point) 

# ----------- THIS geom_rect() STOPS THIS PLOT BEING RENDERED 
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To), 
        ymin=yrng[1], ymax=yrng[2], 
        data=trips) 

p2 # this gives an error message 
# Error in eval(expr, envir, enclos) : object 'variable' not found 

# ----------- THIS NOW WORKS, THANKS TO @smu, SEE BELOW 
p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To, 
        colour=NULL, group=NULL), 
        ymin=yrng[1], ymax=yrng[2], 
       fill='orange', 
       alpha=0.4, 
       data=trips) 
p2 # and I have added fill and alpha to prettify it a bit 

Theo đề xuất của @ tyler-rinker, tôi đã chỉnh sửa mã để bao gồm lỗi ban đầu và giải pháp được chỉ ra bởi @smu. Cảm ơn.

Trả lời

7

Trong ggplot đầu tiên, hãy gọi cho bạn bản đồ colour thành 'biến'. Ánh xạ này vẫn xuất hiện trong cuộc gọi geom_rect, nhưng không có biến nào có tên 'biến' tồn tại trong 'chuyến đi'. Tôi khuyên bạn nên hủy màu bằng cách sử dụng:

p2 <- p + geom_rect(aes(NULL, NULL, xmin=From, xmax=To, colour=NULL), 
       ymin=yrng[1], ymax=yrng[2], 
       data=trips) 

(Chưa thử, nhưng tôi đoán nó sẽ hoạt động).

+1

@gauden bạn có thể đăng bài sửa chữa như một chỉnh sửa để bạn bài gốc cho đầy đủ? –

10

Chỉ cần thêm inherit.aes=FALSE trong bạn geom_rect thực sự hoạt động tốt hơn vì nó sẽ không thay đổi bất kỳ cài đặt bạn đã thực hiện để đồ thị trước đó của bạn (huyền thoại, vv)

+0

Đây là câu trả lời hay hơn. – brittenb

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