箱线图是统计分析里面最为重要且基础的图形,利用R语言绘制箱线图是数据分析里必不可少的一环。这里我总结了面对不同情形时,绘制箱线图的经验。
这里只介绍利用基础绘图命令boxplot,来绘制箱线图。
● 给出一列数据,画出箱线图
library(RColorBrewer)
Value=round(runif(50,min=10,max=50),2)
colors = brewer.pal(8,"Accent")
boxplot(Value,col = "white",cex=0.5, pch=20,outcol=colors[6],
main = "Example",ylab="Value",xlab="Feature")
stripchart(list(Value),vertical = T,method = "jitter",cex = 0.8,
pch = 20,col = colors[1],add=T)
dev.off()
这里,我们采用了stripchart函数以及RColorBrewer包来添加数据点并调整颜色。
● 给出两列数据,画出箱线图
Value1=round(runif(50,min=10,max=50),2)
Value2=round(runif(50,min=6,max=45),2)
colors = brewer.pal(8,"Accent")
boxplot(Value1,Value2,col = "white",cex=0.5, pch=20,outcol=colors[6],
main = "Example",ylab="Value",names =c("Feature1","Feature2"))
stripchart(list(Value1,Value2),vertical = T,method = "jitter",cex = 0.8,
pch = 20,col = colors[1:2],add=T)
dev.off()
注意,此时应当利用boxplot函数里面的内置参数names设置每个箱线图的特征名。并且将stripchart函数里面的数据用列表并起来。
● 给出按照分类变量划分,含有众多特征的dataframe,画出箱线图
library(dplyr)
class = factor(c(rep(1,50),rep(2,50)))
Value1=round(runif(50,min=10,max=50),2)
Value2=round(runif(50,min=6,max=45),2)
Dat = data.frame(class,Value1,Value2)
colors = brewer.pal(8,"Accent")
boxplot(Value1~class,Dat,col = "white",cex=0.5, pch=20,outcol=colors[6], main = "Example",ylab="Value")
Dat1 = Dat %>% filter(class==1)
Dat2 = Dat %>% filter(class==2)
Dat3 = Dat %>% filter(class==3)
Dat4 = Dat %>% filter(class==4)
stripchart(list(Dat1[,"Value1"],Dat2[,"Value1"],Dat3[,"Value1"],Dat4[,"Value1"]), vertical = T,method = "jitter",cex = 0.8,pch = 20,col = colors[5:9],add=T)
dev.off()
这里,我们使用了dplyr包,将数据按照不同类别(1,2,3,4)来分成新的数据,并且,在boxplot函数里,不同于上述几种方式,其数据的给定是以公式的方式给出,形如“特征~类别,数据名”的样式。
箱线图美化
1. 我们会发现画2个箱线图组合时,箱线图的宽度太大,以至于这种箱线图看起来不美观,如Example2,此时我们可以通过在boxplot函数中指定位置,将箱线图显示在1和3的坐标轴上,起到缩小宽度的效果,当然添点也是如此。
Value1=round(runif(50,min=10,max=50),2)
Value2=round(runif(50,min=6,max=45),2)
colors = brewer.pal(8,"Accent")
boxplot(Value1,Value2,col = "white",cex=0.5, pch=20,outcol=colors[6],
main = "Example",ylab="Value",names =c("Feature1","Feature2"),
at=c(1, 3), xlim=c(0, 4))
stripchart(list(Value1,Value2),vertical = T,method = "jitter",cex = 0.8,
pch = 20,col = colors[1:2],add=T,at=c(1, 3))
dev.off()
2. 当特征过多时,箱线图名称容易出现重叠的现象,此时需要对名称进行角度倾斜,而这在boxplot函数参数里面不能设置,此时我们需要取消横轴的命名,采用text函数,贴在画布上。
class = factor(c(rep(1,25),rep(2,25),rep(3,25),rep(4,25)))
Value1=round(runif(50,min=10,max=50),2)
Value2=round(runif(50,min=6,max=45),2)
Dat = data.frame(class,Value1,Value2)
colors = brewer.pal(8,"Accent")
boxplot(Value1~class,Dat,col = "white",cex=0.5, pch=20,outcol=colors[6],
main = "Example",ylab="Value",xlab="",xaxt="n")
axis(side=1, at=1:4, labels=FALSE)
text(c(1:4), x=1:4, y=6, xpd=T, srt=30)
Dat1 = Dat %>% filter(class==1)
Dat2 = Dat %>% filter(class==2)
Dat3 = Dat %>% filter(class==3)
Dat4 = Dat %>% filter(class==4)
stripchart(list(Dat1[,"Value1"],Dat2[,"Value1"],Dat3[,"Value1"],Dat4[,"Value1"]),
vertical = T,method = "jitter",cex = 0.8,
pch = 20,col = colors[5:9],add=T)
dev.off()