R 使用ggplot2根据y值更改线颜色
我有一个关于ggplot2中线条颜色的问题。我需要绘制太阳辐射数据,但我只有6个小时的数据,所以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
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)