【问题标题】:Plot time series using different colours based on factor根据因子使用不同颜色绘制时间序列
【发布时间】:2015-08-30 05:11:18
【问题描述】:

我想绘制一条多色的单线,颜色基于因子中的相应值。例如,每日股票收盘价的时间序列,其中上涨超过一定数量的日子是蓝色的,它已经完成很多的日子是红色的,其他日子是无聊的黑色。

我的数据在一个xts 对象中(用as.numeric(myfactor) 放入其中的因子),我想使用quantmod chartSerieschart_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')

看起来像这样:

即如果使用彩色线段,我觉得将底部图表中的信息与顶部图表中的信息匹配起来会更容易。

【问题讨论】:

  • 你应该发布一些数据。我猜你不想要大多数人所说的“线”,而是想要彩色的“段”。
  • @BondedDust 我添加了一些测试数据。 segments 可能是我想要的,虽然它看起来很低级(不支持 x 轴上的时间戳?)

标签: r xts quantmod


【解决方案1】:

所以这里有一个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(...) 调用中,我们将颜色设置为红色和绿色,并从图例中排除中性色。剩下的就是格式化了。

【讨论】:

    【解决方案2】:

    这段代码最初是 ?segments 上示例代码的一个小修改,这就是为什么图表的标题看起来很奇怪,但我还是决定保留它。逻辑是“[.]”内的术语将根据形成为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 对象真的很麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 2018-04-04
      • 2021-03-24
      • 2016-11-18
      • 1970-01-01
      • 2021-12-07
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多