简介

箱线图主要是通过四分位数描述数据分布,通过最大值,上四分位数,中位数,下四分位数,最小值五处位置描述数据分布情况。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。
从箱线图中,可以大致推断出数据的集中或离散趋势。

下图清楚展示了箱线图的组成部分。
在这里插入图片描述

1. 基础函数—boxplot()

boxplot() 是一个泛型函数,目前支持两种参数类型:公式和数据。
用法

## S3 method for class 'formula'
boxplot(formula, data = NULL, ..., subset, na.action = NULL,
        xlab = mklab(y_var = horizontal),
        ylab = mklab(y_var =!horizontal),
        add = FALSE, ann = !add, horizontal = FALSE,
        drop = FALSE, sep = ".", lex.order = FALSE)

## Default S3 method:
boxplot(x, ..., range = 1.5, width = NULL, varwidth = FALSE,
        notch = FALSE, outline = TRUE, names, plot = TRUE,
        border = par("fg"), col = NULL, log = "",
        pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5),
         ann = !add, horizontal = FALSE, add = FALSE, at = NULL)
  • x 参数为一个数值向量或者列表,若为列表则对列表中每一个子对象依次作出箱线图。
  • formula 为一个公式,比如 y ~ x。
  • data 参数为一个数据框或者列表。
  • na.action 参数是对NA值的操作,默认为忽略。
  • ann 参数为逻辑值,是否绘制坐标轴。
  • range 是一个延伸倍数,决定了箱线图的须延伸到什么位置。
  • width 设置箱子的宽度。
  • varwidth 为逻辑值,若为 TRUE,那么箱子的宽度与样本量的平方根成比例。
  • notch 决定了是否在箱子上画凹槽,可以用于比较两组数据的中位数是否有差异。
  • horizontal 是否水平放置箱线图。
  • add 参数设置是否将箱线图添加到现有图形上。
  • at 参数,当add为TRUE时,设置箱线图位置。

示例

数据形式传入参数

set.seed(1)
boxplot(rnorm(10),rnorm(10),names = c("rn1","rn2"),col = colors()[10:11])

在这里插入图片描述
这两个图不多赘述了,分别使用了varwidth 参数和notch 参数。

set.seed(2)
op <- par(no.readonly=TRUE)
par(bty = "l",mar = rep(3,4),mfrow = c(1,2))
boxplot(rnorm(10),rnorm(5), col = rgb(1,seq(0,1,length.out = 2),0),
          pch = 4,lwd = 1.5,varwidth = T)
boxplot(rnorm(20),rnorm(10), col = rgb(1,seq(0,1,length.out = 2),0),
        pch = 4,lwd = 1.5,varwidth = T,notch = T)
par(op)

在这里插入图片描述
一个常规箱线图,一个带凹槽?简单两句命令即可实现。

op <- par(no.readonly=TRUE)
par(bty = "l")
boxplot(rnorm(10),NULL, names = c("A","B"),col = "red",pch = 4,lwd = 1.5,at = c(1,2))
boxplot(rnorm(10),col = "blue",lwd = 1.5,notch = T,add = T,at = 2)
par(op)

在这里插入图片描述

这里使用datasets基础包中的InsectSprays数据集(不同杀虫剂处理的农业试验单位昆虫数量)演示。

# 简单查看数据集
head(InsectSprays)
#    count spray
# 1    10     A
# 2     7     A
# 3    20     A
# 4    14     A
# 5    14     A
# 6    12     A
dim(InsectSprays)
# [1] 72  2
summary(InsectSprays)
#   count       spray 
# Min.   : 0.00   A:12  
# 1st Qu.: 3.00   B:12  
# Median : 7.00   C:12  
# Mean   : 9.50   D:12  
# 3rd Qu.:14.25   E:12  
# Max.   :26.00   F:12  

公式传入数据,经典坐标轴绘制箱线图,并将离群点样式更改为“4”。

op <- par(no.readonly=TRUE)
par(bty = "l",mar = rep(3,4))
boxplot(count ~ spray, data = InsectSprays,
        col = "lightgray", pch = 4)
par(op)

在这里插入图片描述
箱线图水平放置并上色。

op <- par(no.readonly=TRUE)
par(bty = "l",mar = rep(3,4))
boxplot(count ~ spray, data = InsectSprays,
        horizontal = T, col = rgb(1,seq(0,1,length.out = 6),0), pch = 4,
        lwd = 1.5)
par(op)

在这里插入图片描述
以众所周知的mtcars数据集作为分组箱线图示例。使用at参数区分两组数据。

library(magrittr)
library(tidyverse)
set.seed(3)
op <- par(no.readonly=TRUE)
par(mar = rep(3,4))
col <- sample(colors(),3)
mtcars %>% {boxplot(mpg ~ cyl + am,.,at = c(1:3,5:7),col = col)}
par(op)

在这里插入图片描述
基础函数绘制箱线图到此为止,基本上能满足大家的需求。不过不得不吐槽,基础函数还是不及ggplot。好了,接下来使用ggplot函数绘制箱线图。

2. ggplot()函数

直接上图吧,相关绘图函数大家通过实例去学习。

library(ggplot2)
library(patchwork)
library(RColorBrewer)
InsectSprays %>% {
  p <- ggplot(.,mapping = aes(spray,count))
  p1 <- p + geom_boxplot(outlier.shape = 21,outlier.colour = "red",outlier.fill = "blue",
                         col = "black",fill = brewer.pal(6,"Set1"))
  p2 <- p + stat_boxplot(geom = "errorbar",width=0.3)+
            geom_boxplot(outlier.shape = 21,outlier.colour = "red",outlier.fill = "blue",
                         col = "black",fill = brewer.pal(6,"Set1"))
  p1+p2
}

在这里插入图片描述
效果还不错吧。对比一下,实现你的不同绘图需求。

接下来,利用ggplot实现分组箱线图,并通过ggpubr包的相关函数为组内添加显著性标记。当然,也可以自定义分组。

library(ggplot2)
library(patchwork)
library(RColorBrewer)
library(ggsci)
library(ggpubr)
mtcars %>% {
  p <- ggplot(.,mapping = aes(as.factor(am),mpg,fill = as.factor(cyl)))
  p1 <- p + geom_boxplot()+
            stat_compare_means()+
            scale_fill_lancet()+
            theme_bw()+
            theme(legend.position = "none")
  p2 <- p + geom_boxplot(notch = T)+
            scale_fill_lancet()+
            theme_classic()
  p1 + p2
}

在这里插入图片描述
介绍了这么多,相信大家肯定有所收获噢。支持一下作者吧! 欢迎大家留言讨论。

更新于2020.12.25:
最近有小伙伴私信问如何将箱线变为虚线,在这里统一回答。我的实现如下:

library(ggplot2)
library(patchwork)
library(RColorBrewer)
library(tidyverse)
InsectSprays %>% {
  p <- ggplot(.,mapping = aes(spray,count))
  p1 <- p + stat_boxplot(geom = "errorbar",width=0.3)+
    geom_boxplot(outlier.shape = 21,outlier.colour = "red",outlier.fill = "blue",
                 col = "black",fill = brewer.pal(6,"Set1"))
  p2 <- p + geom_boxplot(col = "black",linetype = 2) +
    stat_boxplot(aes(ymin=..lower..,ymax=..upper..),fill = brewer.pal(6,"Set1"),
                 outlier.shape = 21,outlier.colour = "red",outlier.fill = "blue") +
    stat_boxplot(geom = "errorbar",aes(ymin=..ymax..),width=0.3,color="black")+
    stat_boxplot(geom = "errorbar",aes(ymax=..ymin..),width=0.3,color="black")
  p1+p2
}

在这里插入图片描述


##侵权请联系作者删除!
最后,欢迎关注我的微信公众号。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐