Add vertical lines to quantmod::chart_Series

2019-02-04 15:52发布

I want to add vertical lines on several dates on a certain graph. So far I haven't managed to achieve this simple task. This is what I tried:

> s <- get(getSymbols('nvmi'))["2012::"]
> d1 <- index(s[100])
> d1
[1] "2012-05-24"

> chart_Series(s,TA="addLines(v=d1)")
Error in get.current.chob() : improperly set or missing graphics device

> chart_Series(s)
> abline(v=d1) 
# nothing

> add_TA("addLines(v=d1")
Error in `[.data.frame`(lenv$xdata, Env$xsubset) : 
  undefined columns selected

From what I have already read here, I know that abline is not supposed to work with the new chart_Series function. It doesn't seem to work anyway. The addLines function does not work in any of the forms I tried - plain addLines, plot(addLines(...)), chart_Series(..., TA="addLines(...)") or add_TA("addLines(...)").

I need to use the experimental version of quantmod because it solved other problems I had with the old version. d1 would eventually be a list of dates.

标签: r quantmod
2条回答
Rolldiameter
2楼-- · 2019-02-04 16:29

You can't mix functions from the old and new versions of quantmod's charting functions. If you want to use addLines, you have to use chartSeries. Even if you use addLines and chartSeries, d1 should be an xts object, not a datetime object. For example:

library(quantmod)
data(sample_matrix)
s <- as.xts(sample_matrix)
chartSeries(s,TA="addLines(v=s[100])")

quantmod::chartSeries

If you want to add a vertical line using chart_Series, create a logical xts object with TRUE values where you want the lines to appear and FALSE otherwise. For example:

l <- xts(!as.logical(s[,1]),index(s))
l[100] <- TRUE
chart_Series(s,TA="add_TA(l,on=1)")

quantmod::chart_Series

Also note that you can put the vertical line "behind" the chart by using on=-1 in the add_TA call:

chart_Series(s,TA="add_TA(l,on=-1,col='grey',border='grey')")
查看更多
该账号已被封号
3楼-- · 2019-02-04 16:31

add horizontal line my example:

library(quantmod)
library(lubridate)

stockId<-"CVS"
showperiod<-6   # 6 months

stockData<-getSymbols(stockId, src="yahoo",auto.assign=FALSE)

startDate<-Sys.Date()-months(showperiod,abbreviate = FALSE)
fromDate<-paste0(year(startDate),month(startDate))

subset<-paste0(fromDate,"/")

mytheme <- chart_theme() 
mytheme$col$dn.col  <- "firebrick1" 
mytheme$col$up.col  <- "darkgreen"
chart_Series(stockData, name = stockId, subset = subset, theme = mytheme)

#if you add line at 2018-6-18 to 2018-07-16 & y(price)=72
#you need creat new data to plot
#
ntick<-nrow(stockData["20180618/20180716"]) #2018-6-18 to 2018-07-16 tick numbers
getDate<-index(stockData["20180618/20180716"])
y<-rep(72,ntick)
df<-data.frame(getDate,y)
linedata<-xts(df$y,order.by = df$getDate)
# add line
add_TA(linedata,on=-1,col="blue",lwd=2)

enter image description here

查看更多
登录 后发表回答