Met*_*xis 3 r linegraph smoothing ggplot2
我正在尝试创建一个看起来更像这样的GGPLOT2平滑线图
资料来源:http://www.esrl.noaa.gov/psd/enso/mei/
而不是这样的:
资料来源:https://dl.dropboxusercontent.com/u/16400709/StackOverflow/Rplot02.png
我的数据可以在Dropbox上找到.
看了以前的帖子,我使用了下面的代码:
#MEI Line Graph
d4 <- read.csv("https://dl.dropboxusercontent.com/u/16400709/StackOverflow/Data_MEI.csv")
head(d4,n=20)
MEI<-ggplot(d4,aes(x=d4$Date, y=d4$MEI,group=1))+geom_line()
MEI+stat_smooth(method ="auto",level=0.95)
Run Code Online (Sandbox Code Playgroud)
我认为我需要的是减少发生的平滑量,但我还没有弄清楚如何实现这一点.
d4s<-SMA(d4$MEI,n=8)
plot.ts(d4s)
Run Code Online (Sandbox Code Playgroud)
SMA()效果很好,但我不能让它与ggplot一起使用任何提示都将不胜感激!
And*_*ton 10
请注意,MEI索引是2个月的时间段,所以它已经内置了一些平滑功能.假设您正在使用NOAA ESRL发布的MEI数据,您应该能够创建相同的绘图.
首先,您需要设置系统,因为您将使用timezeones:
# set things up ----
working.dir = file.path('/code/R/StackOverflow/')
setwd(working.dir)
Sys.setenv(TZ='GMT')
Run Code Online (Sandbox Code Playgroud)
现在,下载您的数据并将其读入
d.in <- read.csv("MEI.txt")
Run Code Online (Sandbox Code Playgroud)
下一步是正确格式化日期.
d.in$Date <- as.POSIXct(d.in$Date,
format = "%d/%m/%Y",
tz = "GMT")
Run Code Online (Sandbox Code Playgroud)
因为我们需要弄清楚事物穿过x轴的位置,我们必须在十进制日期工作.使用Epoch值:
d <- data.frame(x = as.numeric(format(d.in$Date,
'%s')),
y = d.in$MEI)
Run Code Online (Sandbox Code Playgroud)
现在我们可以找出过零点.我们将使用Beroe的例子.
rx <- do.call("rbind",
sapply(1:(nrow(d)-1), function(i){
f <- lm(x~y, d[i:(i+1),])
if (f$qr$rank < 2) return(NULL)
r <- predict(f, newdata=data.frame(y=0))
if(d[i,]$x < r & r < d[i+1,]$x)
return(data.frame(x=r,y=0))
else return(NULL)
}))
Run Code Online (Sandbox Code Playgroud)
并在初始数据的末尾添加:
d2 <- rbind(d,rx)
Run Code Online (Sandbox Code Playgroud)
现在转换回日期:
d2$date <- as.POSIXct(d2$x,
origin = "1960-01-01",
format = "%s",
tz = "GMT")
Run Code Online (Sandbox Code Playgroud)
现在我们可以做的情节:
require(ggplot2)
ggplot(d2,aes(x = date,
y = y)) +
geom_area(data=subset(d2, y<=0), fill="blue") +
geom_area(data=subset(d2, y>=0), fill="red") +
scale_y_continuous(name = "MEI")
Run Code Online (Sandbox Code Playgroud)
这给了你:
现在,你真的需要顺利吗?