2016-01-27 17 views
5

Ho una domanda sui colori della linea in ggplot2. Ho bisogno di tracciare i dati della radiazione solare, ma ho solo 6 dati orari, quindi geom_line non concedere un risultato "bello". Ho provato geom_smooth e il risultato è vicino a quello di cui ho bisogno. Ma ho una nuova domanda, è possibile cambiare il colore della linea a seconda del valore y?Cambia il colore della linea in base al valore y con ggplot2

Il codice utilizzato per la trama è

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 uscita desiderata, linea dovrebbe essere rosso per valori di radiazione sotto 250, verde nell'intervallo 250-500 e blu per valori superiori a 500. Solar radiation plot

E 'possibile con geom_smooth? Ho provato a riutilizzare il codice here, ma non ho trovato il punto.

I dati utilizzati per la trama:

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

Grazie in anticipo.

+0

Non sono molto efficiente, ma forse potresti creare un sottoinsieme delle regioni che desideri (ri) colorare e quindi aggiungere geom_line (data = sottoinsieme ....) o creare una colonna aggiuntiva nel set di dati corrente che sarebbe assegna un colore per una parte della regione che desideri colorare in modo diverso – MLavoie

+1

Puoi controllare [Colorazione condizionale di un geom_smooth] (http://stackoverflow.com/questions/32908222/conditional-colouring-of-a-geom-smooth/ 32911114 # 32911114). Dovrai regolare la condizione del colore ('color = y> 0') in base alle tue interruzioni, e 'prendersi cura' del y = 0 ... – Henrik

risposta

7

calcolare la levigatura di fuori ggplot2 e quindi utilizzare 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

Nota cosa succede nei punti di taglio. Se potrebbe essere più attraente visivamente per rendere la griglia x per la previsione molto fine e quindi utilizzare geom_point invece. Tuttavia, il tracciamento sarà lento allora.

+1

Grazie a @Roland molto vicino a quello di cui ho bisogno, la regolazione della x-grid e la riduzione della dimensione del segmento funzionano bene – pacomet

4

Questo non è proprio quello che hai chiesto, ma potrebbe servire allo stesso scopo: invece di colorare la linea, colorare lo sfondo. Per prima cosa creiamo un dataframe di coordinate rettangolo/limite.

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

Poi noi li aggiungiamo alla trama, utilizzando 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

Ciao @heroka, anche se non esattamente quello che mi serve un ottimo approccio che dà lo stesso risultato. Ho accettato la risposta di Roland ma la tua merita di essere selezionata. Grazie – pacomet

+1

Nessun problema, la risposta di Rolands è migliore e risponde alla domanda reale. Questo è più di un "altro modo per risolvere il problema più grande invece di risolvere il problema più piccolo" -answer. – Heroka

Problemi correlati