在quantmod::chart_Series中添加垂直线

13

我想在某个图表上的几个日期添加垂直线。到目前为止,我还没有成功地完成这个简单的任务。这是我尝试过的:

> 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

根据我已经阅读的内容,我知道 abline 函数不能与新的 chart_Series 函数一起使用。无论如何,似乎都不起作用。在我尝试的任何形式下,addLines 函数都不起作用,包括纯粹的 addLinesplot(addLines(...))chart_Series(..., TA="addLines(...)") 或 add_TA("addLines(...)")

我需要使用quantmod的实验版本,因为它解决了我在旧版本中遇到的其他问题。d1最终将成为一个日期列表。

2个回答

16

你不能混合使用旧版和新版quantmod图表函数中的函数。如果想要使用addLines,你必须使用chartSeries。即使使用addLineschartSeriesd1也应该是一个xts对象,而不是一个日期时间对象。例如:

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

quantmod::chartSeries

如果您想要使用 chart_Series 添加竖线,需要创建一个逻辑型的xts对象,其中在您希望出现线条的地方设置为TRUE,否则设置为FALSE。例如:

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

quantmod::chart_Series

还要注意,您可以在add_TA调用中使用on=-1将垂直线放在图表的后面:

chart_Series(s,TA="add_TA(l,on=-1,col='grey',border='grey')")

但是你在这里添加的是竖线而不是水平线,对吗? - agstudy
@agstudy:是的,我认为这是OP标题中的一个打字错误。我不知道如何在特定日期添加水平线,因为日期位于x轴上。 - Joshua Ulrich
好的,谢谢+1。我明白逻辑了,我们只能叠加时间序列(这里是xts对象),否则这将毫无“意义”。 - agstudy
1
@agstudy:确切地说,这是一个容易犯的假设,因为chart_Series仅适用于时间序列对象。 - Joshua Ulrich
谢谢Joshua Ulrich,正是我想要的。 - haki

0

在我的示例中添加水平线:

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)

输入图像说明


很不幸,add_TA(linedata,on=-1,col="blue",lwd=2) 给我返回了错误信息:Error in plot.window(c(1, 141), c(NaN, NaN)) : need finite 'ylim' values。 - PedroJan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接