R语言作图实战——boxplot

作者: 克里克的钟 | 来源:发表于2019-10-29 22:54 被阅读0次

    一、基础知识

    箱式图用于多组数据平均水平和变异程度的直观分析比较。每一组数据均可呈现其最小值(Minimum)、Qlow、Median、Qup、最大值(Maximum),Median表示中位数所在的位置,最小值、最大值形成的间距和QL、QU形成的间距都可以反应数据的变异程度。

    箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。《贾俊平、何晓群、金勇.统计学(第四版):中国人民大学出版社,2009年:66-67》

    image.png

    为了作图和理解ggplot2中的术语,对应的英文图如下:


    image.png

    median:中位数;
    Q1: 下四分位数;
    Q3:上四分位数;
    IQR:四分位范围; = Q3 - Q1
    Maximum = Q3 + 1.5 * IQR;
    Minimum = Q1 - 1.5 * IQR;

    在区间 Q3+1.5ΔQ,~Q1-1.5ΔQ 之外的值被视为应忽略(farout)。最大值与最小值产生于这个区间。区间外的值被视为outliers显示在图上。

    二、ggplot2作图

    image.png

    这是nature文章上的一张图:doi:10.1038/nature11252。没有原始数据,我们就来模拟一份数据:

    library(tidyverse)
    #模拟数据
    group <- rep(c('No', 'Broad', 'Focal'),each = 50)
    set.seed(1)
    No <- rnorm(50, mean = -3.2, sd = 1.1)
    set.seed(2)
    Broad <- rnorm(50, mean = -3.02, sd = 0.5)
    set.seed(3)
    Focal <- rnorm(50, mean = 2.45, sd = 0.8)
    data <- data.frame(group, value = c(No, Broad, Focal))
    data1 <- data.frame(group = c('No', 'No', 'No', 'Broad', 'Broad', 'Focal'), value = c(4, 1.8, -1.6, 4.2, 1.5, -3.2 ))#添加几个区间外的值
    data <- rbind(data, data1)
    
    data$group<-factor(data$group,levels=c('No', 'Broad', 'Focal'),ordered = TRUE)#按照上图的顺序排列
    
    #绘图
    y <- ggplot(data=data,mapping = aes(x=group, y=value, color = group))+
      geom_boxplot(fill ='white', color = "darkgrey", size=0.5, width = 0.5,outlier.shape = NA )+
      geom_jitter(color = "darkblue", shape = 4, size = 1,  width = 0.05)+
      labs(
        x = "",
        y = "mRNA expression",
        title = 'IGF2'
      )+
      theme_bw()+
      theme(
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(), #次级网格线), #网格线
        )
    tiff("fig.tiff", res = 300, width = 700, height = 800)
    y
    dev.off()
    

    得到图如下:


    image.png

    图就做好了,跟文章的图差别不大。但是,上图没有类似误差线的横线,而发表的文章中基本上都会。接下来我们处理这个问题。
    在ggplot()后面添加一行

    stat_boxplot(geom ='errorbar', width = 0.4)
    

    就可以了。


    image.png

    完整代码:

    y <- ggplot(data=data,mapping = aes(x=group, y=value))+
      stat_boxplot(geom ='errorbar', color = 'darkgrey', width = 0.4) +
      geom_boxplot(fill = "white", color = 'darkgrey', size=0.5, width = 0.8,outlier.shape = NA )+
      geom_jitter(color = "darkblue", shape = 4, size = 1,  width = 0.05)+
      labs(
        x = "",
        y = "mRNA expression",
        title = 'IGF2'
      )+
      theme_bw()+
      theme(
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(), #次级网格线), #网格线
        )
    tiff("fig.tiff", res = 300, width = 700, height = 800)
    y
    dev.off()
    

    待完善的地方:IGF2文章中的图用的是斜体,不知道有没有办法改;如何让x坐标轴的No ampl.显示成两行。
    横线的添加参考于:https://www.r-bloggers.com/exploring-ggplot2-boxplots-defining-limits-and-adjusting-style/

    相关文章

      网友评论

        本文标题:R语言作图实战——boxplot

        本文链接:https://www.haomeiwen.com/subject/ordnvctx.html