在同一副图形中输出多个箱线图用于比较数据的分布情况是探索分析阶段一个比较常见的需求,本文介绍四种使用R来实现的方法。

先说一下本案例使用的数据的背景:该数据集为广州2013~2015年每年的1月1日~11月17日的每日平均气温数据。做此分析的目的,是为了说明广州2015年比过去两年更热。

完整的分析过程见这篇文章《数据分析完整过程演示——气温数据分析》,本文抽出其中的箱线图部分,对箱线图的绘制进行详细介绍。

step1 载入数据

#设定工作目录,并从工作目录读取数据setwd('D:/data_visual/data/4.3box_plot')wea<-read.csv(file = "weather.csv",header = TRUE)#查看数据的前6行head(wea)

## 日期 year2013 year2014 year2015 ## 1 1月1日 7 6 5 ## 2 1月2日 9 12 8 ## 3 1月3日 6 12 7 ## 4 1月4日 6 8 9 ## 5 1月5日 5 10 17 ## 6 1月6日 7 10 14

step2 绘制箱线图

要求:分别对13年、14年、15年的气温绘制箱线图,并尝试把他们显示在同一幅图形中以便于比较

方法一、用R基础包中的boxplot函数绘制箱线图,并使用par函数将输出的三幅图形显示在同一个画面中

par(mfrow=c(1,3)) boxplot(wea$year2013) boxplot(wea$year2014) boxplot(wea$year2015)

箱线图如何描述数据(连载数据可视化)(1)

输出的三幅图形中,纵轴的起始位置不同,不便于比较。此方法不可用。

另外三种方法需要对数据进行变换(宽表变长表)

#将数据从宽表变成长表,需要使用reshape2包library(reshape2)weather<-melt(wea,id.vars = '日期',variable.name = '年份',value.name = '气温')#查看转换后的数据格式head(weather)

## 日期 年份 气温 ## 1 1月1日 year2013 7 ## 2 1月2日 year2013 9 ## 3 1月3日 year2013 6 ## 4 1月4日 year2013 6 ## 5 1月5日 year2013 5 ## 6 1月6日 year2013 7

方法二、利用基本绘图函数绘制箱线图

#仍然使用基础包中的boxplot函数进行绘图,以公式y~x的形式输入数据boxplot(weather$气温~weather$年份,col='skyblue',main='广州2013~2015年每日气温数据箱线图')

4

箱线图如何描述数据(连载数据可视化)(2)

纵轴起始位置相同,可以看出2015年的气温分布,中位数明显高于过去两年,2015对应的箱线图的箱体也更高一点。

下面的两种方法需要使用ggplot2包

#利用ggplot2包进行绘图library(ggplot2)#导入ggplot2的主题包library(ggthemes)

方法三、使用ggplot2包中的qplot函数进行绘图

#以x,y的顺序排列数据qplot(年份,气温,data = weather,geom = 'boxplot') theme_economist labs(title='广州2015年比过去两年更热',subtitle='通过绘制箱线图进一步佐证条形图和线图得出的结论')

箱线图如何描述数据(连载数据可视化)(3)

方法四、使用ggplot2包中的ggplot函数进行绘图

ggplot(weather,aes(x=年份,y=气温)) geom_boxplot #使用ggtheme包中的经济学人主题 theme_economist labs(title='广州2015年比过去两年更热', subtitle='通过绘制箱线图进一步佐证条形图和线图得出的结论')

个人认为在数据探索阶段,Excel、SPSS、Python、R这四种工具比较起来,使用R进行探索性绘图,是相对来说最合适的。因为Excel数据量大时,很卡;SPSS同样卡,而且数据的整理和处理非常不方便;Python的绘图函数没有R中的好用,也不太容易记忆。R里面的ggplot2包很强大,花点时间掌握后,用起来非常方便。

,