2015-10-02 11 views
8

Ich analysiere eine Reihe, die um Null variiert. Und um zu sehen, wo es Teile der Serie gibt, die tendenziell überwiegend positiv oder überwiegend negativ sind, zeichne ich eine geom_smooth. Ich frage mich, ob es möglich ist, die Farbe der glatten Linie davon abhängig zu machen, ob sie über oder unter 0 liegt. Unten ist ein Code, der ein Diagramm erzeugt, ähnlich wie das, was ich erstellen möchte.Bedingte Färbung eines geom_smooth

set.seed(5) 
r <- runif(22, max = 5, min = -5) 
t <- rep(-5:5,2) 
df <- data.frame(r+t,1:22) 
colnames(df) <- c("x1","x2") 
ggplot(df, aes(x = x2, y = x1)) + geom_hline() + geom_line() + geom_smooth() 

Ich betrachtete die geglätteten Werte berechnet wird, um sie zu dem df Hinzufügen und dann eine scale_color_gradient, aber ich frage mich, ob es einen Weg gibt diese direkt in ggplot zu erreichen.

+0

Was macht diese Linie? 'Werte (t) <- 1: 5' – zx8754

+0

Absolut nichts. habe es jetzt entfernt. –

+0

@MarijnStevering Wenn ich Ihren Code ausführen, habe ich einen Fehler: "Fehler: geom_hline erfordert die folgende fehlende Ästhetik: Yintercept". Vielleicht möchten Sie es hinzufügen (obwohl 'geom_hline' nicht für Ihr tatsächliches Problem benötigt wird). +1 für eine nette erste Frage. – Henrik

Antwort

7

können Sie verwenden das n Argument in geom_smooth „Anzahl von Punkten zu bewerten glattere bei“ zu erhöhen, um noch einige y-Werte nahe Null zu erstellen . Verwenden Sie dann ggplot_build, um die geglätteten Werte vom Objekt ggplot abzurufen. Diese Werte werden in einer geom_line verwendet, die über die ursprüngliche Zeichnung hinzugefügt wird. Als Letztes plotten wir die y = 0 Werte mit der geom_hline.

# basic plot with a larger number of smoothed values 
p <- ggplot(df, aes(x = x2, y = x1)) + 
    geom_line() + 
    geom_smooth(linetype = "blank", n = 10000) 

# grab smoothed values 
df2 <- ggplot_build(p)[[1]][[2]][ , c("x", "y")] 

# add smoothed values with conditional color 
p + 
    geom_line(data = df2, aes(x = x, y = y, color = y > 0)) + 
    geom_hline(yintercept = 0) 

enter image description here

6

Etwas wie folgt aus:

# loess data 
res <- loess.smooth(df$x2, df$x1) 
res <- data.frame(do.call(cbind, res)) 

res$posY <- ifelse(res$y >= 0, res$y, NA) 
res$negY <- ifelse(res$y < 0, res$y, NA) 

# plot 
ggplot(df, aes(x = x2, y = x1)) + 
    geom_hline() + 
    geom_line() + 
    geom_line(data=res, aes(x = x, y = posY, col = "green")) + 
    geom_line(data=res, aes(x = x, y = negY, col = "red")) + 
    scale_color_identity() 

enter image description here

+1

Gute Idee, aber es hat einige unerwünschte Probleme ... – tonytonov

+0

@tonytonov Ich bin bewusst, habe keine Zeit im Moment, dachte, ich könnte teilen, damit das OP beginnen kann, fühlen sich frei zu bearbeiten. – zx8754

+0

@tonytonov aktualisiert, wieder muss etwas Arbeit ... – zx8754