r - 在ggplot2中绘制运行平均值

标签 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

一位 friend 为我编写了一个函数,用于计算颜色观测值的运行平均值,但我不知道如何将线(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)

剧情:
p <- ggplot(hares, aes(Julian, Color))
p  +
  geom_jitter(width = 1, height = 5, color="blue", alpha = .65) 

您能帮我将运行平均值'haresAveNoNa'添加到情节中吗?
非常感谢!

最佳答案

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

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

enter image description here

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

为了回答您的特定问题,假设您确实需要从单独的数据中添加滚动均值线,而不是即时对其进行计算。如果滚动平均值是数据框中的另一列,则只需将新的列名称指定为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()

使用单独的数据框向图表添加滚动平均值

如果滚动平均值位于单独的数据帧中,则需要将该数据帧提供给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()

更新:显示日期,而不是数字Julian

首先,将Julian转换为Date格式。我不知道数据中从Julian到日期的实际映射,因此对于此示例,我们假设Julian是一年中的某一天,将一年的第一天计算为1,并假设年份是2015年。
hares$Date = as.Date(hares$Julian + as.numeric(as.Date("2015-01-01")) - 1)

现在,我们使用新的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")

enter image description here

关于r - 在ggplot2中绘制运行平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40857319/

相关文章:

r - 如何更改 ggplot2 构面的顺序

r - 在 ggplotly 中显示抖动

r - 如何按日期获取帧或矢量的切片?

r - 将所有相似的列表合并到一个列表列表中

r - 除了 texplot 之外,如何在 R 中将文本转换为图像?

r - 将正态分布绘制到现有图中

r - 试图在 ggplot 中加粗 y 轴

r - 按两个变量之一对 ggplot 条形图进行排序

r - 是否可以使用 RStudio 在 OSX 上配置 R 图形事件处理?

从 Shiny 的 DataTable 中检索行