如何将错误栏添加到ggplot对象

时间:2018-01-22 22:03:09

标签: r ggplot2

我有两个数据集,如下所示

df1<- structure(list(time = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), .Label = c("24", "48", "72"), class = "factor"), place = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("B,C", "D,E", "F,G"
), class = "factor"), key = c("boy1", "boy2", "boy3", "boy1", 
"boy2", "boy3", "boy1", "boy2", "boy3"), value = c(177.72258835, 
0, 74.438539625, 134.3410045, 48915.1, 38.302204425, 97.32286187, 
25865.25, 28.67291878), x = c("1", "2", "3", "1", "2", "3", "1", 
"2", "3"), y = c(177.72258835, 0, 74.438539625, 134.3410045, 
48915.1, 38.302204425, 97.32286187, 25865.25, 28.67291878)), .Names = c("time", 
"place", "key", "value", "x", "y"), row.names = c(NA, -9L), class = "data.frame")


df2<- structure(list(time = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), .Label = c("24", "48", "72"), class = "factor"), place = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("B,C", "D,E", "F,G"
), class = "factor"), key = c("boy1", "boy2", "boy3", "boy1", 
"boy2", "boy3", "boy1", "boy2", "boy3"), value = c(58.852340736, 
0, 21.291893740908, 42.92051958201, 72521.52726, 16.309811239722, 
32.403556124268, 38347.81965, 10.342042262244), x = c("1", "2", 
"3", "1", "2", "3", "1", "2", "3"), y = c(58.852340736, 0, 21.291893740908, 
42.92051958201, 72521.52726, 16.309811239722, 32.403556124268, 
38347.81965, 10.342042262244)), .Names = c("time", "place", "key", 
"value", "x", "y"), row.names = c(NA, -9L), class = "data.frame")

我想将它们与df2一起绘制为df1

的标准偏差

当我绘制df1时,我会执行以下操作

library(ggplot2)

ggplot(df1, aes(x, y, col = key)) +
  geom_point() +
  scale_x_discrete(labels=c("first", "second", "third"), limits = c(1, 2,3)) +
   facet_grid(time ~ .)

但现在我想让第二个df作为标准偏差(即df1中的第一个y值是177.72259,所以它的标准差是{{{}中相应的y值。 1}},即58.85234)。

2 个答案:

答案 0 :(得分:1)

这是给你的一种方式。我在第二个geom_point()中更改了sd的形状。由于y刻度对于两个图具有宽范围,因此您可以看到点重叠。

ggplot() +
geom_point(data = df1, aes(x, y, col = key)) +
geom_point(data = df2, aes(x, y, col = key), shape = 22, alpha = 0.3) +
scale_x_discrete(labels=c("first", "second", "third"), limits = c(1, 2, 3)) +
facet_grid(time ~ ., scale = "free_y")

enter image description here

答案 1 :(得分:1)

如果我理解你的问题,听起来你想在你的情节中包含误差条。如果您只是将标准错误添加为附加变量,则可以仅使用单个数据框来完成此操作:

df <- structure(list(time = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L),
      .Label = c("24", "48", "72"), class = "factor"), place = structure(c(1L, 1L, 1L, 
      2L, 2L, 2L, 3L, 3L, 3L), .Label = c("B,C", "D,E", "F,G"), class = "factor"), 
      key = c("boy1", "boy2", "boy3", "boy1", "boy2", "boy3", "boy1", "boy2", "boy3"), 
      value = c(58.852340736, 0, 21.291893740908, 42.92051958201, 72521.52726,
      16.309811239722, 32.403556124268, 38347.81965, 10.342042262244), 
      x = c("1", "2", "3", "1", "2", "3", "1", "2", "3"), y = c(177.72258835, 0, 
      74.438539625, 134.3410045, 48915.1, 38.302204425, 97.32286187, 25865.25, 28.67291878), 
      sd = c(58.852340736, 0, 21.291893740908, 42.92051958201, 72521.52726, 16.309811239722, 
      32.403556124268,38347.81965, 10.342042262244)), .Names = c("time", "place", "key", 
      "value", "x", "y", "sd"), row.names = c(NA, -9L), class = "data.frame")

然后你可以使用geom_errorbar()将错误条添加到情节中,如下所示(我正在借用&#34; free-y&#34;来自@ jazzurro的缩放技巧&#39;上面的答案):< / p>

ggplot(df, aes(x, y, col = key)) +
  geom_point() +
  scale_x_discrete(labels=c("first", "second", "third"), limits = c(1, 2,3)) +
  facet_grid(time ~ .) +
  geom_errorbar(aes(ymin = y-sd, ymax = y+sd)) +
  facet_grid(time ~ ., scale = "free_y")

enter image description here

不幸的是,您的数据有点偏差,因为某些测量值的幅度大于其他测量值(特别是在时间= 48和时间= 72时);您可能需要考虑日志转换,以便较小的观察值的误差条看起来不会那么微不足道。