站点工具
本站推荐
最多访问
- genetics(28277)
- cell(28065)
- r(25212)
- coi(21080)
- r_basics(20003)
- statistical_test(15505)
- recurrence(15174)
- lessons(14853)
- cor(14475)
- inbreeding_risk(14386)
箱线图又称为盒形图、箱须图(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() # 改变风格
传统的箱线图如上所述,各组数据的图的箱的宽度一致,箱也是方的。而为了展示更多的信息,可以加以修饰。
用箱的宽度展示数据量(数据中的数字个数),比较流行的做法是宽度与数据量的平方根成正比。
刻痕就是将中位数附近变得更窄,用于展示各组数据的中位数之间是否有显著的差异。比如两个箱线图之间的刻痕坐标没有重叠(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()