ggplot条形图,包含多个组的数据框中的错误栏

时间:2017-07-24 02:02:00

标签: r ggplot2 bar-chart data-visualization

对不起,如果这是一个愚蠢的问题,但如果我有这样的数据框......:

Year Location Value SE.Value 
2010   USA     10      1
2010   USA     11      1
2011   USA     12      2
2011   USA     20      4
2012   USA     13      1

我想要一个条形图,每年绘制一次平均值,并使用SE.Value(标准误差)的总和来确定误差线。

这样做的正确方法是什么?

在我的方法(下面)中,我不断收到错误,我看到多个错误条,因为我认为它不是计算聚合值而是计算值之间的差异 - 每行的SE.Value。

err_bar_limits <- aes(ymin = (df$Value - df$SE.Value), ymax = (df$Value + df$SE.Value))

ggplot(data=df, aes(x=df$Year, y=df$Value)) + geom_bar(position="dodge", stat="identity") + geom_errorbar(err_bar_limits, width=0.2, position="dodge")

对于上述错误的示例,这就是我的意思:

enter image description here

由于上述问题,我调整了尝试......:

avg_vals <- aggregate(df$Value, list(df$Year), mean)
avg_se_vals <- aggregate(df$SE.Value, list(df$Year), mean)

我认为应该给我一个具有平均值或SE.Value按“年”分组的数据框,对吧?

然后从那里我尝试了......:

err_bar_limits <- aes(ymin = (avg_vals$Value - avg_se_vals$SE.Value), ymax = (avg_vals$Value + avg_se_vals$SE.Value))

ggplot(data=df, aes(x=df$Year, y=df$Value)) + geom_bar(position="dodge", stat="identity") + geom_errorbar(err_bar_limits, width=0.2, position="dodge")

但是我收到了错误

Aesthetics must be either length 1 or the same as the data 

我知道这可能是一个愚蠢的错误,但我之前从未真正使用过ggplot,所以我有点卡在这里。

我知道我的原始方法是完全错误的,我需要按年度对误差条min / max进行分组,但我不确定如何以这种方式尝试来克服错误。

希望有意义......

1 个答案:

答案 0 :(得分:1)

当您致电err_bar_limits时,您将获得以下信息:

* ymax -> avg_vals$Value + avg_se_vals$SE.Value
* ymin -> avg_vals$Value - avg_se_vals$SE.Value

geom_bar()无法理解这一点。因此,您应该直接将其提供给geom_bar

ggplot(data=df, aes(x=df$Year, y=df$Value)) +
geom_bar(position="dodge", stat="identity") +
geom_errorbar(aes(ymin = (avg_vals$Value - avg_se_vals$SE.Value), ymax = (avg_vals$Value + avg_se_vals$SE.Value)),
width=0.2, position="dodge")

这是我的代码:

avg_vals <- aggregate(df$Value, list(df$Year), mean)
avg_se_vals <- aggregate(df$SE.Value, list(df$Year), mean)

ndf = merge(avg_vals, avg_se_vals, by = "Group.1")
names(ndf) = c("Year", "Avg", "SE")
ndf

library(ggplot2)
ggplot(data = ndf, aes(x = ndf$Year, y = ndf$Avg)) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_errorbar(aes(ymax = ndf$Avg + ndf$SE, ymin = ndf$Avg - ndf$SE),
                width = 0.2, position = "dodge")