2016-01-27 12 views
5

ggplot2の線の色について質問があります。私は日射データをプロットする必要がありますが、私は唯一の6時間ごとのデータを持っているので、geom_lineは "素晴らしい"出力を与えていません。私はgeom_smoothを試しましたが、結果は私が必要とするものに近いです。しかし、私は新しい質問がある、それはyの値に応じて線の色を変更することは可能ですか?y値に応じて線の色を変更するggplot2

プロットするために使用されるコードは、ラインが500 Solar radiation plotより高い値に対して250~500間隔と青緑色、250の下に放射線値に対する赤でなければならない、所望の出力において

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) 

あります

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(data = subset ....)を追加するか、現在のデータセットに追加の列を作成します別の色にしたい領域の色を割り当てます – MLavoie

+1

[条件付き色のgeom_smooth]をチェックすることができます(http://stackoverflow.com/questions/32908222/conditional-colouring-of-a-geom-smooth/ 32911114#32911114)。あなたはあなたの休憩に応じて色の状態( 'color = y> 0')を調整し、y = 0を世話しなければなりません。 – Henrik

答えて

7

)(scale_fill_identityを使用して、プロットに追加する平滑外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

カットポイントで何が起こるか注意してください。より視覚的に魅力的な場合は、予測のためのXグリッドを非常に細かくして、代わりにgeom_pointを使用してください。しかし、プロットは遅くなります。

+1

おかげで@Rolandは私が必要とするものに非常に近く、Xグリッドを調整してセグメントサイズを小さくするとうまくいく – 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")) 

その後、我々は

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

ローランドの答えは良いと実際の質問に答えます。これは、「より小さな問題を解決するのではなく、より大きな問題を解決するもう1つの方法」です。 – Heroka

関連する問題