我想绘制一条多色的单线,颜色基于因子中的相应值。例如,一个股票日收盘价的时间序列,上涨超过一定数量的天数是蓝色的,下跌很多的天数是红色的,其他天数是无聊的黑色。
我的数据在 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')
看起来像这样:
IE。如果使用彩色线段,我觉得将底部图表中的信息与顶部图表中的信息相匹配会更容易。
最佳答案
所以这是一个 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
) 来指示 yield /损失是否 > 1%。然后我们用这个来驱动geom_segment(...)
, 颜色编码 status
.在 scale_color_manual(...)
调用,我们将颜色设置为红色和绿色,并从图例中排除中性色。其余的都是格式化。
关于r - 基于因子使用不同颜色绘制时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289849/