我想绘制一条多色的线条,颜色基于一个因子中的相应值。例如,每日股票收盘价的时间序列,其上涨超过一定数量的天数为蓝色,其中已经完成的天数为红色,其他日期为红色。无聊的黑色。
我的数据位于xts
对象中(其中包含as.numeric(myfactor)
因子),我想使用quantmod chartSeries
或chart_Series
功能。但如果这是不可能的,那么使用plot
的东西就足够了。
一些示例数据:
library(xts)
x = xts( data.frame( v=(rnorm(50)+10)*10, type=floor(runif(50)*4) ),
order.by=as.Date("2001-01-01")+1:50)
我可以这样画出来:
library(quantmod)
chartSeries(x$v)
addTA(x$type, type='p')
即。如果使用彩色线段,我觉得将底部图表中的信息与顶部图表相匹配会更容易。
答案 0 :(得分:2)
所以这是一个ggplot
解决方案。它涉及更多,但提供更复杂的格式选项。
library(quantmod)
sp500 <- getSymbols("^GSPC", from="2015-01-01", auto.assign=FALSE)
sp500 <- Cl(sp500) # extract close
sp500 <- merge(sp500, dailyReturn(sp500)) # add daily returns
sp500 <- merge(lag(Cl(sp500),1), sp500) # merge with close lagged by 1 day
names(sp500) <- c("ymin", "ymax", "return")
library(ggplot2)
library(scales)
df <- with(sp500,
data.frame(xmin=c(lag(index(sp500),1)),
xmax=index(sp500),
ymin, ymax, return))
df$status <- with(df,ifelse(return>0.01,"up",ifelse(return< -0.01,"down","neutral")))
ggplot(df) +
geom_segment(aes(x=xmin, xend=xmax, y=ymin, yend=ymax, color=status)) +
scale_color_manual(values=c(up="green", down="red", neutral="grey50"),
breaks=c("up","down"),
labels=c("Gain > 1%", "Loss > 1%")) +
scale_x_date(breaks=date_breaks("months"), labels=date_format("%b"))+
labs(x=NULL, y="Closing Price", title="S&P 500") +
theme(panel.background =element_rect(fill="black"),
panel.grid = element_blank())
与其他答案一样,基本思想是根据增益/损失的大小绘制颜色编码的段。因此,我们首先提取收盘价,添加一列退货,然后添加另一列收盘价格滞后1天。然后我们用两列日期创建一个data.frame,也是滞后1天。然后我们添加一列(status
)以指示增益/损失是否> 1%。然后我们使用它来驱动geom_segment(...)
,按status
进行颜色编码。在scale_color_manual(...)
调用中,我们将颜色设置为红色和绿色,并从图例中排除中性色。其余的都是格式化。
答案 1 :(得分:1)
这段代码最初只是?segments
上示例代码的一个小mod,这就是为什么图表的标题看起来很奇怪,但我还是决定把它留下来。逻辑是“[。]”内的术语将根据形成为tail(y,-1)
和head(y,-1)
之间差异的连续值之间的差异来“选择”颜色,默认为“黑色”和在这种情况下,阈值为1,但可以很容易地改变:
set.seed(123)
x <- 1:12; y <- rnorm(12)
plot(x, y, main = "arrows(.) and segments(.)")
s <- seq(length(x)-1)
arrows(x[s], y[s], x[s+1], y[s+1],
col= c("black", "red", "blue")[1+ # default=1
(tail(y,-1)-head(y,-1) < -1) + # big down (1+1)
2*(tail(y,-1)-head(y,-1) > 1) ] ) # big up (1+2)
如果您只想要无聊的线段,可以使用segments
功能而不是arrows
。
我再一次读到这个问题,你说你已经在你的xts-object中有了一个因子变量,虽然我的理解是xts-objects可能无法保存因子类型列,因为它们是详细说明zoo-class和coredata是一个R矩阵(因此没有级别属性)。但也许量子人有一个解决方法呢?这就是你发布一些数据的另一个原因,请使用dput
来呈现对象。从控制台输出构建xts-objects是一件非常麻烦的事。