2016-01-27 22 views
5

Ggplot2'deki çizgi renkleri hakkında bir sorum var. Güneş radyasyonu verilerini çizmem gerekiyor ama sadece 6 saatlik veriye sahibim, bu yüzden geom_line "güzel" outuput vermez. geom_smooth denedim ve sonuç ihtiyacım olana yakın. Ama yeni bir sorum var, y değerine bağlı olarak çizgi rengini değiştirmek mümkün mü?ggplot2 ile y değerine bağlı olarak çizgi rengini değiştirin

arsa için kullanılan kod, istenen çıkış olarak

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) 

, satır 500 Solar radiation plot daha yüksek değerler, 250 altında 250-500 aralığında, yeşil ve mavi radyasyon değerleri kırmızı olmalıdır olduğu

geom_smooth ile mümkün müdür? here kodunu yeniden kullanmayı denedim, ancak noktayı bulamadım. arsa için kullanılan

veri: önceden

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

teşekkürler.

+0

Gerçekten verimli değilim, ancak istediğiniz rengi (yeniden) istediğiniz bölgelerin alt kümelerini oluşturabilir ve ardından geom_line (data = subset ....) ekleyebilir veya geçerli veri kümenizde ek bir sütun oluşturabilirsiniz. Renklendirmek istediğiniz bölgenin bir kısmı için renk atayın – MLavoie

+1

[Bir geom_smooth'un koşullu renklendirmesi] 'ni kontrol edebilirsiniz (http://stackoverflow.com/questions/32908222/conditional-colouring-of-a-geom-smooth/ 32911114 # 32911114). Renk koşullarını ('color = y> 0') molalarınıza göre ayarlamalısınız ve 'çok iyi bir yaklaşıma ihtiyacım olmasa da' y = 0 ... – Henrik

cevap

7

ggplot2 dışında yumuşatmayı hesaplayın ve sonra kullanmak kullanarak, arsa eklemek 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

Kesim noktalarında ne olduğuna dikkat edin. X-kılavuzunu çok iyi yapmak için görsel olarak daha çekici olabilir ve bunun yerine geom_point kullanın. Ancak, çizim daha sonra yavaş olacaktır.

+1

Teşekkürler @Roland'a ihtiyacım olana çok yakınım, x-ızgarayı ayarlama ve segment boyutunu azaltma gayet iyi çalışıyor – pacomet

4

Bu sizin için tam olarak istediğin şey değil, aynı amaca hizmet edebilir: çizgiyi renklendirmek yerine, arka planı renklendirin. Önce dikdörtgen/limit koordinatlarının bir veri çerçevesini oluşturuyoruz.

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

Sonra 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

Hi @heroka'ya dikkat etmelisiniz. Bu aynı sonucu verir. Roland cevabını kabul ettim ama seninki selecte olanı hak ediyor. Teşekkürler – pacomet

+1

Endişelenmeyin, Rolands cevabı daha iyidir ve asıl soruyu yanıtlar. Bu daha çok "daha küçük sorunu çözmek yerine büyük problemi çözmenin başka bir yolu". – Heroka

İlgili konular