用户工具

箱线图(Box plot)

箱线图又称为盒形图、箱须图(box-and-whisker plot and box-and-whisker diagram)等等([箱/盒][线/须/形/状/式]图),是描述统计学中常用的一种图示法,能够直观地展示一组数据的最大值、最小值、中位数、上四分位数、下四分位数,便于样本之间的比较。一个典型的盒形图如下图:

箱线图的组件

如上图所示,盒形图由盒/箱(box)、须(whisker)以及点(当有异常值时,用点表示)组成。

盒的三条平行线依次表示上四分位数、中位数、下四分位数。中位数即一组数据的中间值,即按顺序排列时处于中间的数,如果数据中数字为偶数个时,中位数为中间两个数的平均值。上四分位数为最大的数与中位数之间的数据的中间值。下四分位数为最小的数与中位数之间的数据的中间值。

上四分位数和下四分位数之间的距离称为内距(又称四分位差,Interquartile Range,IQR)。比上四位数大1.5IQR或比下四分位数小1.5IQR数称为异常值。最大值和最小值并不是指整组数据中最大和最小的数,而是指除去异常值之后的最大的数和最小的数。

须线从盒/箱的上下沿画到最大或最小值。

计算中位数、上下四分位数可以很方便地用R的fivenum函数计算,输出结果依次为最小的数、下四分位数、中位数、上四分位是、最大的数,比如:

而boxplot所用的最大值和最小值用boxplot.stats函数计算。用boxplot函数可以非常方便的画出一组数据的boxplot。如下图:

盒形图可以很直观地比较几组数据之间的差异,比如要比较几个班之间的成绩的总体分布情况,就可以使用boxplot直观的展示,比如下图:

可以很容易地看出,就英语来说,2班整体要比1班和三班好很多。而三个班之间的体育成绩则差距比较小。这样的图也很容易通过R做出来:

options(stringsAsFactors=FALSE)   # R默认把字符型的数据读入为因子,我喜欢关掉这个功能   
library(ggplot2)                  # 使用ggplot2来作图,这里载入这个包
 
dat <- read.delim("ftp://ftp.biolab.wang/data/成绩.tsv")   #读入示例数据
 
ggplot(dat)+
    geom_boxplot(aes(x=班级, y=成绩)) +           # 按照班级来分开做成绩的boxplot   
    scale_y_continuous(limits=c(0,100), breaks=seq(0,100,10), expand=c(0,0))+
    facet_grid(.~课程名称, scales="free_x", space="free_x") +          # 按照课程名称来分面
    xlab(NULL) +                                      # 去掉横坐标标题,以便展示美观
    ylab("期考成绩") +                                 # 纵坐标标题设置为“期考成绩”
    theme_bw()                                        # 改变风格

传统箱线图(traditional box plot)

传统的箱线图如上所述,各组数据的图的箱的宽度一致,箱也是方的。而为了展示更多的信息,可以加以修饰。

变宽箱线图(Variable Width Box Plot) 与 刻痕箱线图(Notched Box Plot)

用箱的宽度展示数据量(数据中的数字个数),比较流行的做法是宽度与数据量的平方根成正比。

刻痕就是将中位数附近变得更窄,用于展示各组数据的中位数之间是否有显著的差异。比如两个箱线图之间的刻痕坐标没有重叠(overlap),那么中位数之间就具有显著的差异。刻痕的宽度与IQR及数据量平方根的倒数成正比。

比如下图:

可以看出,A和B显然在数据量和中位数上边都是一样的。而C数据量就是A和B的两倍。通过看刻痕,ABC的刻痕是有重叠的,他们之间的中位数之间没有显著差异。而D组数据,刻痕的下沿远比ABC刻痕的上沿要高,D与ABC的刻痕没有重叠,因此D组的中位数要显著高于其它的组。本图的作图数据与代码如下:

dat <- list(
    A = rep(c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), times=4),   # 重复四次,数据量为44
    B = rep(c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), times=4),   # 与B组一样,
    C = rep(c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), times=16),  # 重复16次,数据量为176
    D = 2*rep(c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), times=16) # 整体变大为2倍
)
 
boxplot(dat, varwidth = TRUE, notch = TRUE)

同样,用ggplot2作图也可以设置相应的参数做出变宽和刻痕的箱线图。

ggplot(dat)+
    geom_boxplot(aes(x=班级, y=成绩), notch = TRUE, varwidth=TRUE) +           # 按照班级来分开做成绩的boxplot   
    scale_y_continuous(limits=c(0,100), breaks=seq(0,100,10), expand=c(0,0))+
    facet_grid(.~课程名称, scales="free_x", space = "free_x") +          # 按照课程名称来分面
    xlab(NULL) +                                      # 去掉横坐标标题,以便展示美观
    ylab("期考成绩") +                                 # 纵坐标标题设置为“期考成绩”
    theme_bw()              

参考文献


页面工具

Powered by DokuWiki | ©2018-8102 Hong Wang | 桂ICP备18010616号 | 桂公网安备 45010302002017号