2016-01-27 6 views
5

के साथ y मान के आधार पर लाइन रंग बदलें ggplot2 में लाइन रंगों के बारे में मेरा कोई प्रश्न है। मुझे सौर विकिरण डेटा प्लॉट करने की आवश्यकता है लेकिन मेरे पास केवल 6 घंटे का डेटा है, इसलिए geom_line "अच्छा" आउटपुट नहीं देता है। मैंने geom_smooth की कोशिश की है और नतीजा मुझे चाहिए जो मुझे चाहिए। लेकिन मेरे पास एक नया सवाल है, क्या y मान के आधार पर लाइन रंग बदलना संभव है?ggplot2

साजिश के लिए इस्तेमाल किया कोड

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) 

वांछित आउटपुट में, लाइन विकिरण मूल्यों के लिए लाल 250 के तहत 250-500 अंतराल में हरे और नीले रंग मूल्यों के लिए उच्च 500 Solar radiation plot से होना चाहिए, है

क्या यह geom_smooth के साथ संभव है? मैंने कोड here का पुन: उपयोग करने का प्रयास किया है, लेकिन बिंदु नहीं मिला।

डाटा साजिश के लिए इस्तेमाल किया:

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

अग्रिम धन्यवाद।

+0

मैं वास्तव में कुशल नहीं हूं, लेकिन हो सकता है कि आप उन क्षेत्रों का सबसेट बना सकें जिन्हें आप (पुनः) रंग चाहते हैं और फिर geom_line (डेटा = सबसेट ....) जोड़ें या अपने वर्तमान डेटासेट में एक अतिरिक्त कॉलम बनाएं उस क्षेत्र के कुछ रंग को असाइन करें जिसे आप अलग-अलग – MLavoie

+1

रंगना चाहते हैं, आप [geom_smooth की सशर्त रंग] जांच सकते हैं (http://stackoverflow.com/questions/32908222/conditional-colouring-of-a-geom-smooth/ 32911114 # 32911114)। आपको अपने ब्रेक के अनुसार रंग की स्थिति ('color = y> 0') समायोजित करने की आवश्यकता होगी, और वाई = 0 की देखभाल करें ... – Henrik

उत्तर

7

ggplot2 बाहर चौरसाई की गणना करें और उसके बाद का उपयोग का उपयोग कर 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

ध्यान दें कि कट बिंदुओं पर क्या होता है। यदि भविष्यवाणी के लिए एक्स-ग्रिड को बहुत बढ़िया बनाने के लिए अधिक आकर्षक रूप से आकर्षक हो सकता है और फिर इसके बजाय geom_point का उपयोग करें। हालांकि, साजिश तब धीमी हो जाएगी।

+1

धन्यवाद @ रोलैंड जो मुझे चाहिए, उसके बहुत करीब है, एक्स-ग्रिड समायोजित करना और सेगमेंट आकार को कम करना ठीक है – pacomet

4

यह वास्तव में आप के लिए नहीं पूछा गया है, लेकिन एक ही उद्देश्य की सेवा कर सकता है: रेखा को रंगने के बजाय, पृष्ठभूमि रंग। सबसे पहले हम आयताकार/सीमा निर्देशांक का डेटा फ्रेम बनाते हैं।

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

तो हम उन्हें साजिश करने के लिए जोड़ने के लिए, 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

हाय @ हीरोका, हालांकि बिल्कुल ठीक नहीं है कि मुझे एक बहुत अच्छा दृष्टिकोण चाहिए जो एक ही परिणाम देता है। मैंने रोलैंड जवाब स्वीकार कर लिया लेकिन आपका चयन करने योग्य होने का लायक है। धन्यवाद – pacomet

+1

कोई चिंता नहीं, रोलैंड्स उत्तर बेहतर है और वास्तविक प्रश्न का उत्तर देता है। यह एक छोटा मुद्दा हल करने की बजाय बड़ी समस्या को हल करने का एक और तरीका है "-answer। – Heroka