7

我正在处理一些时间序列数据,并希望在某些条件成立时突出显示图表区域。例如:

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))

上面的代码绘制了数据,但是当 close 高于 sma 时,如何突出显示该部分?这个问题类似于如何在绘图上突出显示时间范围?,但它是手动的。ggplot2 中是否有用于条件绘图的功能?

4

1 回答 1

13

基于quantmod包的TA.R文件中的代码,这里是用于查找矩形开始和结束的代码。rle

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)

将其与您链接到的问题的已接受答案中的一些ggplot2代码相结合:

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)

你得到:

在此处输入图像描述

如果您颠倒绘图顺序并alpha=1在其中使用geom_rect它可能(或可能不会)看起来更像您想要的:

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))

在此处输入图像描述


既然你有xts对象。您甚至可能不想转换为data.frame. 下面是如何使用Michael Weylandt 作为 Google Summer of Code项目的一部分创建的xtsExtra包中的全新plot.xts方法来绘制它。

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)

在此处输入图像描述

于 2012-08-26T21:43:50.413 回答