2016-01-27 15 views
5

Ich habe eine Frage zu Linienfarben in ggplot2. Ich muss Solarstrahlungsdaten aufzeichnen, aber ich habe nur 6 stündliche Daten, also geben geom_line nicht einen "netten" outuput. Ich habe versucht geom_smooth und das Ergebnis ist nah an dem, was ich brauche. Aber ich habe eine neue Frage, ist es möglich, die Linienfarbe abhängig vom y-Wert zu ändern?Ändere die Linienfarbe abhängig vom y-Wert mit ggplot2

Der Code für die Auftragung verwendeten

library(ggplot2) 
library(lubridate) 

# Lectura de datos 
datos.uvi=read.csv("serie-temporal-1.dat",sep=",",header=T,na.strings="-99.9") 
datos.uvi=within(datos.uvi, fecha <- ymd_h(datos.uvi$fecha.hora)) 

# geom_smooth 
ggplot(data=datos.uvi, aes(x=fecha, y=Rad_Global_.mW.m2., colour="GLOBAL")) + 
    geom_smooth(se=FALSE, span=0.3) 

In der gewünschten Ausgabe, Zeile höher als 500 für die Strahlungswerte unter 250, grün im Intervall 250-500 und Blau-Werte für rot sein sollte Solar radiation plot

Ist es möglich mit geom_smooth? Ich habe versucht, Code here zu verwenden, konnte aber den Punkt nicht finden.

Daten für das Grundstück verwendet:

dput(datos.uvi) 
structure(list(fecha.hora = c(2016012706L, 2016012712L, 2016012718L, 
2016012800L, 2016012806L, 2016012812L, 2016012818L, 2016012900L, 
2016012906L, 2016012912L, 2016012908L, 2016013000L), latitud = c(37.75, 
37.75, 37.75, 37.75, 37.75, 37.75, 37.75, 37.75, 37.75, 37.75, 
37.75, 37.75), longitud = c(-1.25, -1.25, -1.25, -1.25, -1.25, 
-1.25, -1.25, -1.25, -1.25, -1.25, -1.25, -1.25), altitud = c(300L, 
300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L 
), cobertura_nubosa = c(0.91, 0.02, 0.62, 1, 0.53, 0.49, 0.01, 
0, 0, 0.13, 0.62, 0.84), longitud_de_onda_inicial.nm. = c(284.55, 
284.55, 284.55, 284.55, 284.55, 284.55, 284.55, 284.55, 284.55, 
284.55, 284.55, 284.55), Rad_Global_.mW.m2. = c(5e-04, 259.2588, 
5, 100.5, 1, 886.5742, 110, 40, 20, 331.3857, 0, 0), Rad_Directa_.mW.m2. = c(0, 
16.58034, 0, 0, 0, 202.5683, 0, 0, 0, 89.81712, 0, 0), Rad_Difusa_.mW.m2. = c(0, 
242.6785, 0, 0, 0, 684.0059, 0, 0, 0, 241.5686, 0, 0), Angulo_zenital_.º. = c(180, 
56.681, 180, 180, 180, 56.431, 180, 180, 180, 56.176, 180, 180 
), blank = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    fecha = structure(c(1453874400, 1453896000, 1453917600, 1453939200, 
    1453960800, 1453982400, 1454004000, 1454025600, 1454047200, 
    1454068800, 1454054400, 1454112000), tzone = "UTC", class = c("POSIXct", 
    "POSIXt"))), row.names = c(NA, -12L), .Names = c("fecha.hora", 
"latitud", "longitud", "altitud", "cobertura_nubosa", "longitud_de_onda_inicial.nm.", 
"Rad_Global_.mW.m2.", "Rad_Directa_.mW.m2.", "Rad_Difusa_.mW.m2.", 
"Angulo_zenital_.º.", "blank", "fecha"), class = "data.frame") 

Vielen Dank im Voraus.

+0

Ich bin nicht wirklich effizient, aber vielleicht könnten Sie Teilmenge der Regionen erstellen, die Sie (re) färben und dann geom_line (data = subset ....) hinzufügen oder eine zusätzliche Spalte in Ihrem aktuellen Dataset erstellen möchten Weisen Sie einer Region, die Sie gerne anders färben möchten, eine Farbe zu – MLavoie

+1

Sie können [Bedingte Färbung eines geom_smooth] überprüfen (http://stackoverflow.com/questions/32908222/conditional-colouring-of-a-geom-smooth/) 32911114 # 32911114). Sie müssen den Farbzustand anpassen ('color = y> 0') nach Ihren Pausen, und 'aufpassen' die y = 0 ... – Henrik

Antwort

7

die Glättung außerhalb ggplot2 berechnen und dann verwenden geom_segment:

fit <- loess(Rad_Global_.mW.m2. ~ as.numeric(fecha), data = datos.uvi, span = 0.3) 
#note the warnings 

new.x <- seq(from = min(datos.uvi$fecha), 
      to = max(datos.uvi$fecha), 
      by = "5 min") 

new.y <- predict(fit, newdata = data.frame(fecha = as.numeric(new.x))) 


DF <- data.frame(x1 = head(new.x, -1), x2 = tail(new.x, -1) , 
       y1 = head(new.y, -1), y2 = tail(new.y, -1)) 
DF$col <- cut(DF$y1, c(-Inf, 250, 500, Inf)) 


ggplot(data=DF, aes(x=x1, y=y1, xend = x2, yend = y2, colour=col)) + 
    geom_segment(size = 2) 

resulting plot

Beachten Sie, was an den Schnittpunkten passiert. Wenn es optisch ansprechender ist, das x-Gitter für die Vorhersage sehr gut zu machen, dann verwenden Sie stattdessen geom_point. Allerdings wird das Plotten dann langsam sein.

+1

Dank @Roland sehr nah an dem, was ich brauche, die Anpassung X-Grid und die Verringerung der Segmentgröße läuft gut – pacomet

4

Das ist nicht wirklich das, wonach Sie gefragt haben, aber es könnte dem gleichen Zweck dienen: Statt die Linie zu färben, färben Sie den Hintergrund. Zuerst erstellen wir einen Datenrahmen von Rechteck-/Grenzkoordinaten.

rect_data <- data.frame(xmin=min(datos.uvi$fecha), 
          xmax=max(datos.uvi$fecha), 
          ymin=c(0,250,500), 
          ymax=c(250,500,max(datos.uvi$Rad_Global_.mW.m2.)), 
          col=c("red","green","blue")) 

Dann fügen wir sie zu dem Grundstück, mit scale_fill_identity()

ggplot(data=datos.uvi) + 
    geom_smooth(aes(x=fecha, y=Rad_Global_.mW.m2.),colour="black",se=FALSE, span=0.3) + 
    geom_rect(data=rect_data, aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=col),alpha=0.1)+ 
    scale_fill_identity() 

enter image description here

+0

Hallo @heroka, obwohl nicht genau das, was ich brauche eine sehr gute Vorgehensweise das gibt das gleiche Ergebnis. Ich habe Rolands Antwort angenommen, aber deine verdienen es, die richtige zu sein. Danke – pacomet

+1

Keine Sorge, Rolands Antwort ist besser und beantwortet die eigentliche Frage. Dies ist eher ein "Hier ist ein anderer Weg, um das größere Problem zu lösen, anstatt das kleinere Problem zu lösen". – Heroka

Verwandte Themen