同一价格图中的不同颜色

Different color in the same price plot

我必须根据 kmeans 函数给出的聚类对价格图进行不同的着色。考虑这段代码:

library(tseries)

####

nomiequity <- "^IXIC" 
datastart  <- "2019-09-18"

nsdq.prices <- get.hist.quote(instrument  = nomiequity,    
                              compression = "d",         
                              start       = datastart, 
                              end         = "2020-12-31", 
                              retclass    = "zoo",
                              quote       = "AdjClose")

b<-kmeans(nsdq.prices,3)
c<-b$cluster
d<- merge(nsdq.prices, c)
e<-split(nsdq.prices, c)

plot(nsdq.prices, type="l", col="green", ylim=c(6000, 13000))
    lines(e[["2"]], type = "l", col="red")
    lines(e[["3"]], type = "l", col="blue")

结果几乎就是我需要做的,但我不想在不同的时间显示相同颜色之间的那些联系。

希望这段代码对您有所帮助:

library(tseries)

####

nomiequity <- "^IXIC" 
datastart  <- "2019-09-18"

nsdq.prices <- get.hist.quote(instrument  = nomiequity,    
                              compression = "d",         
                              start       = datastart, 
                              end         = "2020-12-31", 
                              retclass    = "zoo",
                              quote       = "AdjClose")

b<-kmeans(nsdq.prices,3)
c<-b$cluster
d<- merge(nsdq.prices, c)
e<-split(nsdq.prices, c)


e3= e[['3']]
empty <- zoo(order.by=seq.Date(head(index(e3),1),tail(index(e3),1),by="days"))
e3=merge(e3,empty)


e2= e[['2']]
empty <- zoo(order.by=seq.Date(head(index(e2),1),tail(index(e2),1),by="days"))
e2=merge(e2,empty)


plot(nsdq.prices, type="l", col="green", ylim=c(6000, 13000))
lines(e2, type = "l", col="red")
lines(e3, type = "l", col="blue")

我刚用过这个:R: Filling missing dates in a time series?

问题是集群在 line 中合并。当集群在时间序列中发生变化时,您可以使用 rle 长度将数字增加一。为此,使用 Maprep 吃连续数字 l 次。然后,您可以 split 这些不断增长的数字,但使用 cluster 来定义 lines 的颜色。对于后者,使用 lapply 循环拆分的 e.

cl <- kmeans(nsdq.prices, 3)$cluster
l <- rle(as.numeric(cl))$lengths
s <- Map(rep, seq(l), l)
e <- split(cbind(nsdq.prices, cl), unlist(s))

plot(nsdq.prices, type="l", col=7, ylim=c(6000, 13000))
invisible(lapply(e, function(x) lines(x$Adjusted, col=x$cl + 1)))
legend("topleft", leg=c(sprintf("cl %s", 1:3), "missing"), col=c((1:3)+1, 7), lty=1)

没有定义日期的地方会出现空白。我们可以使用 zoo 插值法,通过使用“缺失”颜色重绘原始图。

通过这种方法,我找到了聚类值发生变化的行,然后选择了这些日期并添加了 NA 值以进行调整。 geom_line 在出现 NA 值时中断,从而给出所需的结果。

library(ggplot2)
library(dplyr)
library(data.table)

#add date as a column
datum <- index(d)
d <- as.data.table(d)
d$Datum <- datum

#add row number as a column
d$Row <- 1:nrow(d)

#find rows of d where cluster value changes
rows <- which(d$c != dplyr::lag(d$c))
rows <- d[Row %in% rows]

#add NA values for Adjusted at the Dates where values change(which breaks the geom_line)
rows <- rows[, Adjusted := NA]

#merge rows (NA values of Adjusted) with d
d <- rbind(rows, d)

#create a plot
ggplot(d, aes(x = Datum, y = Adjusted, col = as.factor(c))) + geom_line() + scale_color_manual(values = c("green", "red", "blue"))