2012-08-26 11 views
6

Tôi đang làm việc với dữ liệu chuỗi thời gian và muốn đánh dấu khu vực biểu đồ bất cứ khi nào một số điều kiện nhất định trở thành sự thật. Ví dụ:ggplot2: vùng biểu đồ đánh dấu

require(ggplot2) 
require(quantmod) 
initDate <- "1993-01-31" 
endDate <- "2012-08-10" 
symbols <- c("SPY") 
getSymbols(symbols, from=initDate, to=endDate, index.class=c("POSIXt","POSIXct")) 
spy<-SPY$SPY.Adjusted 
spy$sma<-SMA(spy$SPY.Adjusted,200) 
spy<-spy[-(1:199),] 
spy<-as.data.frame(spy) 
ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

Đoạn mã trên vẽ lô dữ liệu, nhưng làm cách nào để làm nổi bật phần này khi nào gần trên sma? Câu hỏi này tương tự như How to highlight time ranges on a plot?, nhưng sau đó nó là thủ công. Có chức năng nào trong ggplot2 cho âm mưu có điều kiện không?

+3

Câu hỏi đặt ra bạn liên kết đến _is_ đường đến làm cái này. ** ggplot2 ** chưa có chức năng để hiểu một cái gì đó như 'geom_shade_the_region_that_I_have_in_mind_you_know_that_one()'. Bạn phải thực sự cho nó biết khu vực nào bạn muốn tô bóng. – joran

+1

Bạn sẽ tăng cơ hội nhận được không quants để thử nghiệm với mã của bạn nếu bạn đặt trong các cuộc gọi thư viện thích hợp để chỉ ra những gói cần thiết để chạy mã đó. –

+0

@joran cảm ơn rất nhiều vì câu trả lời sâu sắc ~ sẽ làm việc chăm chỉ để tìm ra thứ gì đó hữu ích. – user1234440

Trả lời

13

Dựa trên mã trong tệp TA.R của gói quantmod, đây là mã sử dụng rle để tìm bắt đầu và kết thúc của hình chữ nhật.

runs <- rle(as.logical(spy[, 1] > spy[, 2])) 
l <- list(start=cumsum(runs$length)[which(runs$values)] - runs$length[which(runs$values)] + 1, 
      end=cumsum(runs$lengths)[which(runs$values)]) 
rect <- data.frame(xmin=l$start, xmax=l$end, ymin=-Inf, ymax=Inf) 

Cùng với đó là một số ggplot2 mã từ các accepted answer cho câu hỏi bạn có liên quan đến:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), color="grey20", alpha=0.5, inherit.aes = FALSE) 

Và bạn nhận được:

enter image description here

Nếu bạn đảo ngược thứ tự của âm mưu và sử dụng alpha=1 trong geom_rect nó có thể (hoặc có thể không) trông giống như bạn mong muốn:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), border=NA, color="grey20", alpha=1, inherit.aes = FALSE)+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

enter image description here


Vì bạn có một đối tượng xts. Thậm chí bạn có thể không muốn chuyển đổi thành một số data.frame. Đây là cách bạn có thể vẽ nó sử dụng thương hiệu plot.xts phương pháp mới trong gói xtsExtra tạo ra bởi Michael Weylandt như một phần của một mùa hè Google của Bộ luật project.

spy <- as.xts(spy) 
require(xtsExtra) 
plot(spy, screens=1, 
    blocks=list(start.time=paste(index(spy)[l$start]), 
       end.time=paste(index(spy)[l$end]), col='lightblue'),      
    legend.loc='bottomright', auto.legend=TRUE) 

enter image description here

+0

+1 quá nóng. Michael chắc chắn đã làm một số công việc tuyệt vời! –