• R语言绘制带误差线的条形图


    条形统计图是用一个单位长度表示一定的数量,根据数量的多少画成长短不同的直条.带误差的条形图可以通过误差线来判断显著性。
    在这里插入图片描述
    继续使用我们的汽车销售数据(公众号回复:汽车销售,可以获得该数据)来演示,先导入数据

    library(foreign)
    library(ggplot2)
    library(tidyverse)  
    bc <- read.spss("E:/r/test/tree_car.sav",
                    use.value.labels=F, to.data.frame=T)
    names(bc)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    我们来看下数据,car就是汽车售价,age是年龄,gender是性别,inccat是收入,这里分成4个等级,ed是教育程度。
    假设我们想知道不同教育水平的男女在买汽车的价格上有什么不同,可绘制带误差和可信区间的折线图,关键就是要算出它的标准误se和95%ci.
    我们先生成一个计算标准误se和95%ci的自定义函数,这是国外一位大佬设计的函数,我见好用直接搬运过来了。

    summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                          conf.interval=.95, .drop=TRUE) {
      library(plyr)
      
      # New version of length which can handle NA's: if na.rm==T, don't count them
      length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
      }
      
      # This does the summary. For each group's data frame, return a vector with
      # N, mean, and sd
      datac <- ddply(data, groupvars, .drop=.drop,
                     .fun = function(xx, col) {
                       c(N    = length2(xx[[col]], na.rm=na.rm),
                         mean = mean   (xx[[col]], na.rm=na.rm),
                         sd   = sd     (xx[[col]], na.rm=na.rm)
                       )
                     },
                     measurevar
      )
      
      # Rename the "mean" column    
      datac <- rename(datac, c("mean" = measurevar))
      
      datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean
      
      # Confidence interval multiplier for standard error
      # Calculate t-statistic for confidence interval: 
      # e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
      ciMult <- qt(conf.interval/2 + .5, datac$N-1)
      datac$ci <- datac$se * ciMult
      
      return(datac)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    生成函数后,我们使用自定义函数summarySE生成标准误se和95%ci. Measurevar填入你要衡量比较的指标,这里填入汽车售价,groupvars这里填入性别和教育程度。

    carss<- summarySE(bc, measurevar="car", groupvars=c("gender","ed"))
    
    • 1

    生成了我们需要的做图数据
    在这里插入图片描述
    画条形图和画折线图不同的是,教育这个指标我们要转换成分类变量

    carss$ed <- factor(carss$ed)
    
    • 1

    转换好以后就可以做图了,先做一个带误差线的

    ggplot(carss, aes(x=ed, y=car, fill=gender)) + 
      geom_bar(position=position_dodge(), stat="identity") +
      geom_errorbar(aes(ymin=car-se, ymax=car+se),
                    width=.2,                    # Width of the error bars
                    position=position_dodge(.9))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    画个带置信区间的

    ggplot(carss, aes(x=ed, y=car, fill=gender)) + 
      geom_bar(position=position_dodge(), stat="identity") +
      geom_errorbar(aes(ymin=car-ci, ymax=car+ci),
                    width=.2,                    # Width of the error bars
                    position=position_dodge(.9))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    进行美化一下,一个可以用于发表的图就做成了
    在这里插入图片描述
    如何利用置信区间来判断显著性
    在这里插入图片描述
    在这里插入图片描述
    (图片来自于淼科学网博客。https://blog.sciencenet.cn/blog-430956-717889.html)

  • 相关阅读:
    【Docker】查看每层镜像的大小
    鲸鱼优化算法(WhaleOptimizationAlgorithm,WOA)附matlab代码
    MyEclipse 下载、安装教程
    你看过字符画吗?用 Python 自己实现一个吧
    【JavaEE】Servlet实战案例:表白墙网页实现
    STM32与ZigBee无线通信技术在工业自动化中的应用
    解决readme.md文件中粘贴的图片放到GitHub上无法显示问题
    C++多重、多层、分层继承
    Docker部署Nacos
    安装银河麒麟linux系统docker(docker-compose)环境,注意事项(一定能解决,有环境资源)
  • 原文地址:https://blog.csdn.net/dege857/article/details/125477986