ggplot2 geom_line()和平滑

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)

这给了你:

在此输入图像描述

现在,你真的需要顺利吗?