我希望创建一个图表,显示观察数据的散点图上的运行平均值。这些数据包括随着时间的推移观察野兔的毛色(颜色)(朱利安)。
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
一位朋友为我编写了一个函数,用于计算颜色观察的运行平均值,但我无法弄清楚如何将该线(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'添加到情节中吗? 非常感谢!
答案 0 :(得分:14)
您可以使用rollmean
包中的zoo
计算滚动平均值,而不是编写自己的函数。您可以在ggplot中动态调用rollmean
来添加滚动平均线,或者可以将滚动平均值添加到数据框中,然后绘制它们。我在下面提供了两种方法的示例。下面的代码计算了一个带有七天窗口的居中滚动平均值,但是您可以针对不同窗口大小以及左对齐或右对齐滚动平均值自定义函数,而不是居中。
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()
要回答您的具体问题,假设您确实需要从单独的数据中添加滚动平均线,而不是动态计算。如果滚动平均值是数据框中的另一列,则只需将新列名称赋予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
转换为日期格式。我不知道您的数据中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")