2015-08-29 54 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(...)調用中,我們將顏色設置爲紅色和綠色,並從圖例中排除中性色。其餘的都是格式化。

相關問題