【问题标题】:Add error bars to a barplot将误差线添加到条形图
【发布时间】:2016-01-04 06:09:35
【问题描述】:

我有两个向量。我想制作第一个向量的条形图(足够简单,对)。扭曲的是,第二个向量的每个元素都是第一个向量的每个元素的标准偏差(它本身是 4 个其他值的平均值)。我该怎么做?

有问题的向量:

-4.6521175 0.145839723
 1.1744100 0.342278694
-0.2581400 0.003776341
-0.3452675 0.073241199
-2.3823650 0.095008502
 0.5625125 0.021627196

即,如何将第二列向量的元素作为误差线添加到第一列向量中的相应元素?

注意:在你问之前,是的,我确实在这个网站上进行了广泛的搜索,并进行了很多谷歌搜索,但我的问题更具体一点,即我发现的与我发现的不匹配需要。

【问题讨论】:

    标签: r vector plot bar-chart


    【解决方案1】:

    具有geom_bargeom_errorbarggplot2 的实现:

    library(ggplot2)
    ggplot(df, aes(x=row.names(df), y=V1)) +
      geom_bar(stat="identity", fill="grey") +
      geom_errorbar(aes(ymin = V1 - V2, ymax = V1 + V2), width=0.6) +
      theme_classic() 
    

    这会导致:

    如果要去掉x轴上的数字,可以加:

      theme(axis.title.x=element_blank(),
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank())
    

    到您的 ggplot 代码。


    使用过的数据:

    df <- read.table(text="-4.6521175 0.145839723
     1.1744100 0.342278694
    -0.2581400 0.003776341
    -0.3452675 0.073241199
    -2.3823650 0.095008502
     0.5625125 0.021627196", header=FALSE)
    

    回应your comment,当您想要绘制如此大量的条形图时,有两种可能的解决方案:

    1:只包括轴标签的选择:

    ggplot(df2, aes(x=as.numeric(row.names(df2)), y=V1)) +
      geom_bar(stat="identity", fill="grey", width=0.7) +
      geom_errorbar(aes(ymin = V1 - V2, ymax = V1 + V2), width=0.5) +
      scale_x_continuous(breaks=c(1,seq(10,200,10)), expand=c(0,0)) +
      theme_classic() +
      theme(axis.text.x=element_text(size = 6, angle = 90, vjust = 0.5))
    

    这给出了:

    可以看出,在一个情节中塞满这么多条并不理想。因此参见备选方案 2。

    2:创建可用于创建构面的分组变量:

    df2$id <- rep(letters[1:20], each=10)
    
    ggplot(df2, aes(x=as.numeric(row.names(df2)), y=V1)) +
      geom_bar(stat="identity", fill="grey", width=0.7) +
      geom_errorbar(aes(ymin = V1 - V2, ymax = V1 + V2), width=0.5) +
      scale_x_continuous(breaks=as.numeric(row.names(df2))) +
      facet_wrap(~ id, scales = "free_x") +
      theme_bw() +
      theme(axis.text.x=element_text(angle = 90, vjust = 0.5))
    

    这给出了:

    最后两个例子使用的数据:

    df2 <- data.frame(V1=sample(df$V1, 200, replace=TRUE),
                      V2=sample(df$V2, 200, replace=TRUE))
    

    【讨论】:

    • 非常感谢 Jaap 和 Stephan。如果我要从文件中读取值怎么办(因为这实际上是它们的来源)。该文件没有标题。我做了 x=read.table('some.file') ,现在我需要将两个有问题的向量 (x$V1,x$V2) 传递给 ggplot。我该怎么做?
    • 最后一个问题 Jaap,如何在 X 轴上添加向量元素编号(从 1 开始计数)?
    • 我有大约 190 个数据点。有什么办法可以让印在 X 轴上的数字变小,这样它们就不会重叠?
    • @Stefan 为了减少数字所需的空间,您可以使用theme(axis.text.x = element_text(size = 6, angle = 90, vjust = 0.5))
    • Ooooooopppsss,抱歉,点击失败。
    【解决方案2】:

    我个人最喜欢arrows() 最适合这种图形:

    df <- data.frame(bar = c(-4.6521175, 1.1744100, -0.2581400,  -0.3452675, -2.3823650, 0.5625125),
    error = c(0.145839723, 0.342278694, 0.003776341, 0.073241199, 0.095008502, 0.021627196))
    
    foo <- barplot(df$bar,ylim=c(-6,2),border=NA)
    arrows(x0=foo,y0=df$bar+df$error,y1=df$bar-df$error,angle=90,code=3,length=0.1)
    

    两个细节:

    1. border=NA in barplot() 删除了条形周围的边框,因此您实际上可以看到第三个条形周围的错误须线。由于第三个错误非常小,所以晶须几乎位于条形边框的顶部。

    2. 我在arrows() 中使用了length 参数来减小水平须线的宽度,这在我们有大量条形时尤其重要。默认为length=0.25

    但是,请注意"dynamite plots" have major disadvantages。您写道,您的数据仅来自每个条形的四个原始点。在这种情况下,几乎肯定只绘制原始数据的(抖动的)点图会更好。

    【讨论】:

    • 那是天才。我从来没有想过将箭头的头部倾斜以使其看起来像一个错误栏。
    • 我必须同意,这太棒了。一个人必须在信用到期的地方给予信用。但是有没有办法减少箭头的宽度?当数据点过多时,箭头会相互重叠。
    • @Stefan:说得好。我编辑了我的答案以在arrows() 中包含length 参数(并在barplot() 中使用border=NA 美化问题)。
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2014-05-24
    • 2023-03-19
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多