【问题标题】:Ggplot - How to add 2 different error bars?Ggplot - 如何添加 2 个不同的误差线?
【发布时间】:2020-09-09 07:38:06
【问题描述】:

我尝试制作具有 2 个不同置信区间的条形图 - 一个代表样本中女性的比例,另一个代表男性的比例。每个类别当然有两个不同的置信区间,我怎样才能制作只有 2 个而不是 4 个置信区间的图表?

  ggplot(data, aes(x= GENDER)) + 
  geom_bar(aes(y = (..count..)/sum(..count..)), stat="count", fill=c("deeppink","deepskyblue"), alpha=0.7) +
  scale_y_continuous("Percent",labels = scales::percent)+
  geom_text(aes(label = scales::percent((..count..)/sum(..count..)),
                y= ((..count..)/sum(..count..))), stat="count",vjust = 5) +
  geom_errorbar (aes(ymin = ymin1, ymax =ymax1), width=0.4, colour = "red", alpha =0.9, size= 1.3)+
  geom_errorbar (aes(ymin = ymin2, ymax =ymax2), width=0.4, colour = "red", alpha =0.9, size= 1.3)

先谢谢了!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您只需要调用一次 geom_errorbar,其中 ymin 和 ymax 是向量。按照您的编码方式,ggplot 在两个位置绘制两个误差线,因为它期望 ymin 和 ymax 的位置向量等于图中的条数。例如

    ymin = c(ymin1,ymin2)
    ymax = c(ymax1,ymax2)
    ggplot(data, aes(x= GENDER)) + 
      geom_bar(aes(y = (..count..)/sum(..count..)), stat="count", fill=c("deeppink","deepskyblue"), alpha=0.7) +
      scale_y_continuous("Percent",labels = scales::percent)+
      geom_text(aes(label = scales::percent((..count..)/sum(..count..)),
                    y= ((..count..)/sum(..count..))), stat="count",vjust = 5) +
      geom_errorbar (aes(ymin = ymin, ymax =ymax), width=0.4, colour = "red", alpha =0.9, size= 1.3)
    

    【讨论】:

    • 我的数据框有 116 个样本。当我尝试插入一个包含 2 个值的向量时 - 出现错误 - “错误:美学必须是长度 1 或与数据 (116) 相同”,另一方面 - 插入带有 116 的向量是没有意义的价值观——我该怎么办?
    • 要解决这个问题,您需要将数据放在条形和文本几何图形中,然后将其从对ggplot() 的调用中取出,因此您需要拥有ggplot() + geom_bar(data=data, aes(x=GENDER, y=...) + geom_text(data=data, aes(x=GENDER, y=...),然后是其余的的绘图应该工作。
    【解决方案2】:

    您还可以使用 dplyr::summarise() 提前管理数据,以创建一个数据集,该数据集每组只有一个观察值,具有您想要的任何汇总值。这使得绘图代码更加精简。我在carData 包中的Chile 数据上执行此操作

    data("Chile", package="carData")
    library(dplyr)
    library(ggplot2)
    Chile %>% 
      group_by(sex) %>% 
      dplyr::summarise(n_g= n(), 
                n = sum(!is.na(Chile$sex)),
                prop = n_g/n, 
                ymin = binom.test(n_g, n)$conf.int[1], 
                ymax = binom.test(n_g, n)$conf.int[2]) %>% 
      ggplot(aes(x=sex, y=prop, ymin=ymin, ymax=ymax) )+ 
        geom_bar(stat="identity", alpha=.7, fill=c("deeppink","deepskyblue")) + 
        geom_errorbar(width=.4, colour="red", alpha=.9, size=1.3) + 
        geom_text(aes(label = scales::percent(prop)), vjust = 5) 
    


    编辑

    更改为在 OP 的评论中使用 prop.test()

    data("Chile", package="carData")
     library(dplyr)
     library(ggplot2)
     data <- Chile
     data <- data %>% rename("GENDER" = "sex")
     
     data %>% 
       group_by(GENDER) %>% 
       dplyr::summarise(n_g= n(), 
                        n = sum(!is.na(data$GENDER)),
                        prop = n_g/n,  
                        ymin = prop.test(n_g, n, p=.7, alternative="greater")$conf.int[1], 
                        ymax = prop.test(n_g, n, p=.7, alternative="greater")$conf.int[2]) %>% 
       ggplot(aes(x=GENDER, y=prop, ymin=ymin, ymax=ymax) )+ 
       geom_bar(stat="identity", alpha=.7, fill=c("deeppink","deepskyblue")) + 
       geom_errorbar(width=.4, colour="red", alpha=.9, size=1.3) + 
       geom_text(aes(label = scales::percent(prop)), vjust = 5) 
    

    【讨论】:

    • 嗨!感谢你的回答!两件事: 1. 我计算了置信区间,男性得到 [0 到 0.26],女性得到 [0.73 到 1]。如何在我的图表中显示这些值?我并没有真正了解您在 binom 测试中所做的事情... 2. 我的图表旋转了 90 度,coord_flip() 对我没有帮助。我该怎么办?
    • 您需要将Chile 替换为数据框的名称data,并将group_by(sex) 替换为您的性别变量group_by(GENDER)。然后,在n = sum(!is.na(Chile$sex)), 行中应更改为n = sum(!is.na(data$GENDER))。否则,它应该工作。我使用binom.test() 计算每个组的置信区间,因此汇总数据中的yminymax 值将是每个组的置信区间。
    • 我该如何翻转图表?
    • 更新为使用 prop.test() 您指定的方式来计算置信区间。我还将数据的名称更改为data,将sex的名称更改为GENDER
    • 如果您尝试过coord_flip(),但没有成功,您可以尝试交换xy 变量。
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多