在ggplot2中绘制运行平均值

Kes*_*el1 4 r ggplot2

我希望创建一个图表,显示观察数据的散点图上的运行平均值.这些数据包括随着时间的推移观察野兔的毛色(颜色)(朱利安).

Color  Julian
50  85
50  87
50  89
50  90
100 91
50  91
50  92
50  92
100 92
50  93
100 93
50  93
50  95
100 95
50  95
50  96
50  96
50  99
50  100
0   101
0   101
0   103
50  103
50  104
50  104
50  104
50  104
100 104
100 104
50  109
50  109
100 109
0   110
0   110
50  110
50  110
50  110
50  110
0   112
Run Code Online (Sandbox Code Playgroud)

一位朋友为我编写了一个函数来计算颜色观察的运行平均值,但我无法弄清楚如何将线(haresAveNoNa)添加到图中.

功能:

haresAverage <- matrix( NA, max(hares$Julian), 3 )
for( i in 4:max(hares$Julian) ){
  haresAverage[i,1]<-i
  haresAverage[i,2]<-mean( hares$Color[ hares$Julian >= (i-3) &
                                             hares$Julian <= (i+3)]
                              , na.rm=T )
  haresAverage[i,3]<-sd( hares$Color[ hares$Julian >= (i-3) &
                                           hares$Julian <= (i+3)]

                            , na.rm=T )
}
haresAveNoNa <- na.omit( haresAverage)
Run Code Online (Sandbox Code Playgroud)

剧情:

p <- ggplot(hares, aes(Julian, Color))
p  +
  geom_jitter(width = 1, height = 5, color="blue", alpha = .65) 
Run Code Online (Sandbox Code Playgroud)

你能帮我把流动的平均值'haresAveNoNa'添加到情节中吗?非常感谢!

eip*_*i10 18

您可以使用包来计算滚动平均值rollmean,zoo而不是编写自己的函数.您可以rollmean在ggplot中动态调用以添加滚动平均线,或者您可以将滚动平均值添加到数据框中,然后绘制它们.我在下面提供了两种方法的示例.下面的代码计算了一个带有七天窗口的居中滚动平均值,但是您可以为不同的窗口大小和左对齐或右对齐滚动平均值而不是居中自定义函数.

在飞行中计算滚动平均值 ggplot

library(zoo)

ggplot(hares, aes(Julian, Color)) + 
  geom_point(position=position_jitter(1,3), pch=21, fill="#FF0000AA") +
  geom_line(aes(y=rollmean(Color, 7, na.pad=TRUE))) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

将滚动平均值作为新列添加到数据框中,然后绘制它

要回答您的具体问题,假设您确实需要从单独的数据中添加滚动平均线,而不是动态计算.如果滚动平均值是数据框中的另一列,则只需将新列名称赋予geom_line:

hares$roll7 = rollmean(hares$Color, 7, na.pad=TRUE)

ggplot(hares, aes(Julian, Color)) + 
  geom_point(position=position_jitter(1,3), pch=21, fill="#FF0000AA") +
  geom_line(aes(y=roll7)) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

使用单独的数据框将滚动平均值添加到绘图中

如果滚动平均值位于单独的数据框中,则需要将该数据框提供给geom_line:

haresAverage = data.frame(Julian=hares$Julian, 
                          Color=rollmean(hares$Color, 7, na.pad=TRUE))

ggplot(hares, aes(Julian, Color)) + 
  geom_point(position=position_jitter(1,3), pch=21, fill="#FF0000AA") +
  geom_line(data=haresAverage, aes(Julian, Color)) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

UPDATE:要显示日期,而不是数字Julian

首先,转换Julian为日期格式.我不知道Julian你的数据到目前为止的实际映射,所以对于这个例子,让我们假设这Julian是一年中的某一天,将一年的第一天计为1,让我们假设这一年是2015年.

hares$Date = as.Date(hares$Julian + as.numeric(as.Date("2015-01-01")) - 1)
Run Code Online (Sandbox Code Playgroud)

现在我们使用我们的新Date列绘制x轴.要自定义中断数和日期标签,请使用scale_x_date.

ggplot(hares, aes(Date, Color)) + 
  geom_point(position=position_jitter(1,3), pch=21, fill="#FF0000AA") +
  geom_line(aes(y=rollmean(Color, 7, na.pad=TRUE))) +
  theme_bw() +
  scale_x_date(date_breaks="weeks", date_labels="%b %e")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述