【问题标题】:Adding mean value to facets向构面添加平均值
【发布时间】:2015-04-18 08:28:39
【问题描述】:

我有这个图,它计算给定冬季鸟类物种的丰度指数: 此图形来自此代码(不包括主题和比例):

ggplot (a, aes (pentada,ika,colour=inv,group=inv,na.rm=T)) + geom_line()+
facet_wrap(~inv, ncol=3)+labs(title="SYLATR\n",x="",y="IKA")

数据框有6个变量:

pentada / censos / yr / total / inv / ika

问题是我想在每个冬季添加一条线,显示所有年份的丰度平均值,但我不知道如何。我应该在每个越冬季节之后将平均值添加为一个新列吗?在这种情况下,我该怎么做呢?

谢谢。

【问题讨论】:

  • 对样式的评论:彩色线条可能看起来很漂亮,但您不需要它,因为每个方面的顶部都有分面名称。右边的图例就是浪费空间,没有它你可以在图表中获得更多细节。
  • 感谢您的评论,您是对的。

标签: r ggplot2 facet-wrap


【解决方案1】:

我不确定您是否想要全球平均值,即冬季和几天的平均值。如果是这样,那么上面影子的解决方案可能是最好的;这样的事情也可以:

#toy data
df <- data.frame(t = rep(1:100,9), pop = rnorm(900)+20, 
    year = rep(letters[1:9], 9, each = 100))

#make graph
ggplot(data = df, aes(x = t, y = pop, colour = year, na.rm=T)) + 
    geom_line() + facet_wrap(~year, ncol = 3) + 
    geom_line(aes(x=t, y = mean(pop)))

如果你只想要冬天的平均值,以便白天仍然有动态,我认为你应该先将它添加到数据框中,然后再调用 ggplot。

#aggregate the mean population over years but not days
yearagg.df <- aggregate(data = df, pop ~ t, mean)

#make plot
ggplot(data = df, aes(x = t, y = pop, colour = year, na.rm=T)) + 
    geom_line() + 
    facet_wrap(~year, ncol = 3) + 
    geom_line(data = yearagg.df, aes(y = pop, x=t), color = 'black')

第二个代码 sn-p 导致此图:

更新:如果将平均数据放回数据框中,您可能会更容易绘图,这样您就可以从同一数据框中绘制所有层,而不是将来自多个帧的数据混合/匹配到一个图中。

df.m <- merge(df, yearagg.df, by = 't', suffixes = c('.raw', '.mean'))
ggplot(data = df.m, aes(x = t, colour = year, na.rm=T)) + 
    geom_line(aes(y = pop.raw)) + 
    facet_wrap(~year, ncol = 3) + 
    geom_line(aes(y = pop.mean), color = 'gray')

【讨论】:

  • 这是我一直在寻找的,但由于某种原因我得到一个错误:错误:ggplot2 不知道如何处理 uneval 类的数据
  • 第一个解决方案只是画一条水平线,我正在寻找类似于第二个解决方案的东西:所以我可以直接将所有年份的平均值与给定年份进行比较。
  • 我在编辑修复的最后一行代码中有错字。而不仅仅是'black',它应该是color = 'black'。希望这是错误的原因。
  • 好的!我纠正了那个,但现在我有另一个错误!错误:美学的长度必须为一,或者与 dataProblems:inv 的长度相同,这是代码 ggplot (data=a, aes(pentada, ika, color = inv, group=inv, na.rm=T)) + geom_line() + facet_wrap(~inv, ncol = 3)+ geom_line(data=yearagg.df, aes(pentada, mean(ika)), colour="black") 有什么提示吗? (抱歉编辑不好)
  • yearagg.df 上的geom_line() 内的aes() 调用中的所有变量实际上都必须存在于yearagg.df 中。或者,您可以使用mergeyearagg.df 数据添加到您的原始数据框中,这样您就不必在完全不同的数据框上调用geom_line() 来获得您想要的行。我会用这种merge 方法更新我的答案。
猜你喜欢
  • 2015-01-13
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
相关资源
最近更新 更多