2015-08-29 17 views
5

Chciałbym wykreślić pojedynczą linię, która jest wielokolorowa, a kolory są oparte na odpowiedniej wartości w czynniku. Na przykład szereg czasowy dziennej ceny zamknięcia, gdzie dni wzrosły o więcej niż pewną kwotę, są niebieskie, a dni, w których minęło dużo czasu, są na czerwono, a pozostałe dni są w kolorze czerwonym. nudny czarny.Szeregi czasowe wydruku przy użyciu różnych kolorów na podstawie współczynnika

Moje dane jest w xts obiektu (ze współczynnikiem umieścić tam z as.numeric(myfactor)), i chciałbym być przy użyciu quantmod chartSeries lub chart_Series funkcje. Ale jeśli to nie jest możliwe, wystarczyłoby coś, co używało plot.

Niektóre przykładowe dane:

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) 

I mogę wykreślić ją tak:

library(quantmod) 
chartSeries(x$v) 
addTA(x$type, type='p') 

który wygląda tak: plot using chartSeries

Tj Czułem, że łatwiej byłoby dopasować informacje w dolnym zestawieniu do górnego, jeśli używane są kolorowe segmenty linii.

+1

Powinieneś opublikować pewne dane. Domyślam się, że nie chcesz tego, co większość ludzi nazwałaby "linią", ale raczej chcesz mieć kolorowe "segmenty". –

+0

@BondedDust Dodałem trochę danych testowych. "segmenty" mogą być tym, czego chcę, choć wydaje się dość niski poziom (brak obsługi sygnatur czasowych na osi X?) –

Odpowiedz

1

Ten kod zaczynał się jako niewielki mod kodu przykładowego na ?segments i dlatego tytuł wykresu wygląda dziwnie, ale postanowiłem go zostawić w każdym razie. Logika polega na tym, że terminy wewnątrz "[.]" Będą "wybierać" kolory w oparciu o różnicę między kolejnymi wartościami utworzonymi jako różnica między tail(y,-1) i head(y,-1), przy czym domyślną wartością jest "czarny", a progi są w tym przypadku 1 , ale które mogą być łatwo zmienione:

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) 

Jeśli tylko chciał nudnych odcinków można użyć funkcji segments zamiast arrows.

enter image description here

Zdaję sobie sprawę, na po raz kolejny czyta pytanie, że mówiłeś, że już zmienną czynnikiem w XTS-obiektu, choć rozumiem, że XTS-obiekty mogą nie być w stanie utrzymać kolumny czynnikiem typu , ponieważ są one rozwinięciem klasy zoo i coredata jest macierzą R (stąd nie ma atrybutów poziomu). Ale może faceci kwantowi mają obejście tego? To byłby kolejny powód, dla którego warto opublikować dane, i PROSZĘ użyć do przedstawienia obiektu dput. Budowanie Xts-obiektów z wyjścia konsoli jest prawdziwym kłopotem.

2

Oto rozwiązanie ggplot. Jest nieco bardziej zaangażowany, ale oferuje bardziej wyrafinowane opcje formatowania.

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()) 

Podobnie jak w przypadku innych odpowiedzi podstawową ideą jest zwrócenie segmenty kolorami na podstawie wielkości zysku/straty. Zaczynamy od wyodrębnienia cen zamknięcia, dodania kolumny zwrotów, a następnie dodania kolejnej kolumny cen zamknięcia opóźnionej o 1 dzień. Następnie tworzymy data.frame z tego z dwiema kolumnami dat, również opóźnionymi o 1 dzień. Następnie dodajemy kolumnę (status), aby wskazać, czy zysk/strata wynosiła> 1%. Następnie używamy tego do napędu geom_segment(...), kodowania kolorów przez status. W wywołaniu scale_color_manual(...) ustawiamy kolory na czerwony i zielony i wykluczamy neutralny kolor z legendy. Reszta to całe formatowanie.

Powiązane problemy