R 使用ggplot2根据y值更改线颜色

R 使用ggplot2根据y值更改线颜色,r,ggplot2,R,Ggplot2,我有一个关于ggplot2中线条颜色的问题。我需要绘制太阳辐射数据,但我只有6个小时的数据,所以geom_line不会给出一个“好”的结果。我尝试了geom_smooth,结果接近我所需要的。但我有一个新问题,是否可以根据y值改变线条颜色 用于绘图的代码为 library(ggplot2) library(lubridate) # Lectura de datos datos.uvi=read.csv("serie-temporal-1.dat",sep=",",header=T,na.str

我有一个关于ggplot2中线条颜色的问题。我需要绘制太阳辐射数据,但我只有6个小时的数据,所以
geom_line
不会给出一个“好”的结果。我尝试了
geom_smooth
,结果接近我所需要的。但我有一个新问题,是否可以根据y值改变线条颜色

用于绘图的代码为

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)

提前谢谢。

这并不是你真正想要的,但可能有同样的目的:不是给线条上色,而是给背景上色。首先,我们创建一个矩形/极限坐标的数据框

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

计算ggplot2外部的平滑度,然后使用
geom_段

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)

fit我的效率不高,但也许您可以创建要(重新)着色的区域子集,然后添加几何线(data=subset…),或者在当前数据集中创建一个额外的列,该列将为您希望着色的部分区域指定颜色。您可以检查。您需要根据您的休息时间调整颜色条件(
color=y>0
),并“注意”y=0…感谢@Roland非常接近我的需要,调整x网格并减少段大小运行fineHi@heroka,尽管这并不完全是我需要的一种非常好的方法,可以提供相同的结果。我接受了罗兰的回答,但你的答案值得选择。谢谢,不用担心,罗兰的答案更好,并且回答了实际问题。这更像是“这里有另一种方法来解决更大的问题,而不是解决更小的问题”——答案。
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()
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)