2017-09-11 2 views
2

sagen, dass ich die folgende Datenrahmen haben:Wie eine Zeile mit Farbvektor in R plotten Plotly

ret <- rnorm(100, 0, 5) 
df <- data.frame(
    x = seq(1, 100, 1), 
    ret = ret, 
    y = 100 + cumsum(ret), 
    col = c(ifelse(ret > 0, "red", "forestgreen"), NA)[-1] 
) 

hier die Renditen einiger fiktiven Finanzanlage mit rnorm namens ‚ret‘ Ich bin zu simulieren, und bin Definieren eines Farbvektors mit dem Namen "Col", wobei Upticks grün und Downticks rot sind.

Was ich produzieren will, ist so etwas wie die folgenden:

library(ggplot2) 
ggplot(df, aes(x=x, y=y)) + geom_line(aes(colour=col, group=1)) 

enter image description here

Aber ich möchte ein ähnliches Bild machen mit plotly so, dass ich auf Abschnitte des Plots vergrößern kann. Mein erster Gedanke war, einfach zu versuchen, mit der ggplotly() Funktion um den Code, der das gewünschte Bild erzeugt:

library(plotly) 
ggplotly(ggplot(df, aes(x=x, y=y)) + geom_line(aes(colour=col, group=1))) 

Using ggplotly

Aber die Handlung ist nicht mehr gruppiert. Außerdem habe ich versucht, plot_ly() verwenden, aber nicht die Liniensegmente scheinen erhalten ihre Farbe zu machen nach dem ‚col‘ Attribut, das ich festgelegt wird:

plot_ly(data=df, x = ~x) %>% add_lines(y = ~y, line = list(color=~col)) 

enter image description here

Aber meine Farbe Argument hat keinen Einfluss auf die Farbe der Linie. Ich habe verschiedene andere Dinge ausprobiert, aber immer noch mit einem der beiden unerwünschten Plots. Jede Hilfe würde sehr geschätzt werden!

Hinweis: Ich habe bereits Candlestick- und OHLC-Diagramme mit plot_ly() erstellt, aber ich kann nicht mit ihnen arbeiten, da die y-Achse nicht skaliert wird, wenn Sie in einen Teilbereich des Diagramms hineinzoomen.

Antwort

2

Ich konnte das gewünschte Verhalten von ggplotly erhalten, indem geom_segment mit und machen jedes Segment Verbindung zum nächsten (x, y) Wert, unabhängig von Farbe:

library(dplyr) 
df = df %>% 
    arrange(x) %>% 
    mutate(x_next = lead(x), y_next = lead(y)) 

p = ggplot(df, aes(x=x, y=y)) + 
    geom_segment(aes(xend = x_next, yend = y_next, colour=col)) 
ggplotly(p) 

Das heißt, ich habe keine gute Antwort für warum ggplotly produziert nicht die gewünschte Leistung an erster Stelle.