箱线图由箱和“须”(whisker)两部分组成。箱的范围是从数据的下四分位数到上四分位数,也就是常说的四分位距(IQR)。箱的中间有一条表示中位数,或者说50%分位数的线。须则是从箱子的边缘出发延伸至1.5倍四分位距内的最远的点。如果图中有超过须的数据点,则其被视为异常值,并以点来表示。如下图使用偏态的数据展示了直方图、密度曲线和箱线图之间的关系。
本篇介绍如何使用ggplot2制作箱线图,我们使用geom_boxplot()函数,一个简单的格式如下:
geom_boxplot(outlier.colour="black", outlier.shape=16, outlier.size=2, notch=FALSE)
outlier.colour, outlier.shape, outlier.size : 展示离群值的颜色,形状,大小
notch : 逻辑值。如果为真,画一个有缺口的方框图。凹口显示中值周围的置信区间,该区间通常基于中值+/- 1.58*IQR/sqrt(n)。槽口用于比较组;如果两个盒子的凹口没有重叠,这是中间值不同的有力证据。
准备数据
使用ToothGrowth数据集
# Convert the variable dose from a numeric to a factor variable ToothGrowth$dose <- as.factor(ToothGrowth$dose) head(ToothGrowth)
基本的箱线图
library(ggplot2) # Basic box plot p <- ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot() p # Rotate the box plot p + coord_flip() # Notched box plot ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot(notch=TRUE) # Change outlier, color, shape and size ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot(outlier.colour="red", outlier.shape=8, outlier.size=4)
添加平均值
使用stat_summary()函数
# Box plot with mean points p + stat_summary(fun.y=mean, geom="point", shape=23, size=4)
选择指定组展示
p + scale_x_discrete(limits=c("0.5", "2"))
带有点的箱线图
通过geom_dotplot()函数或者geom_jitter()函数添加点
# Box plot with dot plot p + geom_dotplot(binaxis='y', stackdir='center', dotsize=1) # Box plot with jittered points # 0.2 : degree of jitter in x direction p + geom_jitter(shape=16, position=position_jitter(0.2))
映射分组颜色
改变箱子的线条颜色
盒子图线颜色可以通过变量不同水平自动控制:
# Change box plot line colors by groups p<-ggplot(ToothGrowth, aes(x=dose, y=len, color=dose)) + geom_boxplot() p
我们也可以使用下列的函数手动指定箱子的颜色
- scale_color_manual() : to use custom colors
- scale_color_brewer() : to use color palettes from RColorBrewer package
- scale_color_grey() : to use grey color palettes
# Use custom color palettes p+scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9")) # Use brewer color palettes p+scale_color_brewer(palette="Dark2") # Use grey scale p + scale_color_grey() + theme_classic()
改变箱子的填充颜色
# Use single color ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot(fill='#A4A4A4', color="black")+ theme_classic() # Change box plot colors by groups p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) + geom_boxplot() p
也可以手动改变填充颜色
- scale_fill_manual() : to use custom colors
- scale_fill_brewer() : to use color palettes from RColorBrewer package
- scale_fill_grey() : to use grey color palettes
# Use custom color palettes p+scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) # use brewer color palettes p+scale_fill_brewer(palette="Dark2") # Use grey scale p + scale_fill_grey() + theme_classic()
改变图例位置
p + theme(legend.position="top") p + theme(legend.position="bottom") p + theme(legend.position="none") # Remove legend
改变x轴变量的顺序
p + scale_x_discrete(limits=c("2", "0.5", "1"))
多组箱线图
# Change box plot colors by groups ggplot(ToothGrowth, aes(x=dose, y=len, fill=supp)) + geom_boxplot() # Change the position p<-ggplot(ToothGrowth, aes(x=dose, y=len, fill=supp)) + geom_boxplot(position=position_dodge(1)) p
改变颜色并添加点
# Add dots p + geom_dotplot(binaxis='y', stackdir='center', position=position_dodge(1)) # Change colors p+scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
自定义箱线图
添加标题或改变主题
# Basic box plot ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot(fill="gray")+ labs(title="Plot of length per dose",x="Dose (mg)", y = "Length")+ theme_classic() # Change automatically color by groups bp <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) + geom_boxplot()+ labs(title="Plot of length per dose",x="Dose (mg)", y = "Length") bp + theme_classic()
手动改变颜色
# Continuous colors bp + scale_fill_brewer(palette="Blues") + theme_classic() # Discrete colors bp + scale_fill_brewer(palette="Dark2") + theme_minimal() # Gradient colors bp + scale_fill_brewer(palette="RdBu") + theme_minimal()