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

上記のコードはデータをプロットしますが、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ます。これは、Google SummerofCodeプロジェクトの一部としてMichaelWeylandtによって作成された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 に答える