2015-08-29 21 views
5

我想绘制一条多色的单线,并且颜色基于相应的因子值。例如,每日股票收盘价格的时间序列,其中涨幅超过一定数量的日子是蓝色的,而且它已经完成的日子是红色的,而其他日子则在无聊的黑色。使用基于因子的不同颜色的绘图时间序列

我的数据是在一个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') 

,看起来像这样: plot using chartSeries

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

+1

你应该发布一些数据。我猜你不希望大多数人会称之为“行”,而是想要着色“段”。 –

+0

@BondedDust我已经添加了一些测试数据。 'segments'可能是我想要的,尽管它看起来很低级别(不支持x轴上的时间戳?) –

回答

1

此代码作为?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

enter image description here

我意识到在再次阅读的问题,你说你已经有了你的XTS对象的一个​​因素变量,虽然我的理解是,XTS的对象可能不是能够保持因子型列,因为它们是动物园类的详细描述,并且Coredata是一个R矩阵(因此没有等级属性)。但也许量子家伙有一个解决方法?所以这将是你发布一些数据的另一个原因,并且请使用dput来呈现该对象。从控制台输出构建xts对象是一件非常麻烦的事情。

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(...)调用中,我们将颜色设置为红色和绿色,并从图例中排除中性色。其余的都是格式化。

相关问题