【问题标题】:How can I add error bars to a ggplot object如何将误差线添加到 ggplot 对象
【发布时间】:2018-01-22 22:03:09
【问题描述】:

我有两个如下的数据集

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,所以它的标准差是df2中对应的y值,即58.85234) .

【问题讨论】:

标签: r ggplot2


【解决方案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() 在绘图中添加误差线,如下所示(我从上面@jazzurro 的答案中借用了“free-y”比例技巧):

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

很遗憾,您的数据有些偏差,因为某些测量值的幅度比其他测量值大得多(尤其是在 time=48 和 time=72 时);您可能需要考虑对数转换,以便较小观察值的误差线不会显得那么微不足道。

【讨论】:

    【解决方案2】:

    这是适合您的一种方法。我在第二个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")
    

    【讨论】:

    • 我现在要去上班了。所以我暂时不能回复你。如果需要任何修改,我很乐意稍后与您合作。希望你不要介意。
    • 感谢您的消息,最好将 sd 设为 + 和 - 并在每组中划一条线(就像 boy1 的第一条、第二条和第三条有一条线)
    • @NikBernou 你想如何使用 + 和 -?哪些值有 +,哪些值有 -?
    • @NikBernou 看来您需要误差线。我希望你能从一开始就说明这一点。不管怎样,你现在得到了一个很好的答案。祝你好运。
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2021-01-25
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多