**

数值型变量的可视化

**

本篇是数据可视化系列中的第二篇,承接上文,本文主要介绍如何使用matplotlib模块、pandas模块和seaborn模块绘制直方图、核密度图、箱线图、小提琴图、折线图以及面积图。

一.直方图和核密度曲线

1.matplotlib模块

plt.hist(x,bins=10,range=None,normed=False,weights=None,         cumulative=False,bottom=None,histtype='bar',         align='mid',orientation='vertical',rwidth=None,         log=False,color=None,label=None,stacked=False)

x : 指定要绘制直方图的数据。
bins : 指定直方图条形的个数。
range : 指定直方图数据的上下界,默认包含绘图数据的最大值和最小值。
normed : 是否将直方图的频数转换为频率。 (如果报错的话,就用desnity替代)
weights : 该参数可为每一个数据点设置权重。
cumulative : 是否可以计算累计频数或频率。
bottom : 可以为直方图的每个条形添加基准线,默认为0.
histtype : 指定直方图的类型,默认为bar , 除此之外还有barstacked、step、stepfilled。
align : 设置直方图的摆向方向,默认为垂直方向。
rwidth : 设置直方图条形的宽度。
log : 是否需要对绘图数据进行log变换。
color : 设置直方图的填充色。
edgecolor : 设置直方图边框色。
label : 设置直方图的标签,通过legend展示图例。
stacked : 当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放。

2.pandas模块

对于matplotlib模块的直方图,如果想加入核密度图就会很吃力,pandas可以很好的将两者结合在一起。

3.seaborn模块
尽管这幅图满足了两种图形的合成,但是表达的是所有乘客的年龄分布,如果老板想看按性别分组,研究不同性别下年龄分布的差异,前两个模块都会很复杂实现起来,这里就推荐使用seaborn中的displot函数。

sns.distplot(a,bins=None,hist=True,kde=True,rug=False,fit=None,hist_kws=None,             kde_kws=None,rug_kws=None,fit_kws=None,color=None,vertical=False,             norm_hist=False,axlabel=None,label=None,ax=None)

a : 指定绘图数据,可以是序列、一维数组或是列表。
bins : 指定直方图条形的个数。
hist : bool类型,是否绘制直方图,默认为Ture。
kde : bool类型,是否绘制核密度图,默认为True。
rug : bool类型的参数,是否绘制须图(如果数据比较密集,该参数比较有用),默认为False。
fit : 指定一个随机分布对象(需调用scipy模块中的随机分布函数),用于绘制随机分布的概率曲线。
hist_kws : 以字典的形式传递直方图的其他修饰属性,如填充色、边框色、宽度等。
kde_kws : 以字典的形式传递核密度图的其他修饰属性,如线的颜色、线的类型等。
rug_kws : 以字典的形式传递须图的其他修饰属性,如线的颜色、线的宽度等。
fit_kws : 以字典的形式传递概率密度曲线的其他修饰属性,如线条颜色、形状、宽度等。
color : 指定图形的颜色,除了随机分布曲线的颜色。
vertical : bool类型,是否将图形垂直显示,默认为True。
norm_hist : bool类型,是否将频数改为频率,默认为False。
axlabel : 用于显示轴标签。
ax : 指定子图的位置。

二.箱线图

箱线图是另一种体现数据分布的图形,从图中可以得到数据的下须值(Q1-1.5IQR)、下四分位数(Q1)、中位数(Q2)、均值,上四分位(Q3)数和上须值(Q3+1.5IQR)。同样的,matplotlib、pandas、seaborn模块均可完成。

1.matplotlib

plt.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,            widths=None,patch_artist=None,meanline=None,showmeans=None,            boxprops=None,labels=None,flierprops=None,medianprops=None,            meanprops=None,capprops=None,whiskerprops=None)

x : 指定要绘制箱线图的数据。
north : 是否要以凹口的形式展现箱线图,默认为凹口。
sym : 指定异常点的形状,默认为+号显示。
vert : 是否需要将箱线图垂直摆放,默认为垂直摆放。
whis : 指定上下须与上下四分位的距离,默认为1.5倍的四分位差。
position : 指定箱线图的位置,默认为[0 , 1 , 2 …]。
widths : 指定箱线图的宽度,默认为0.5.
patch_artist : bool类型,是否填充箱体的颜色,默认false。
meanline : bool类型,是否用线的形式表示均值,默认为False。
showmeans : bool类型,是否显示均值,默认为False。
showcaps : bool类型,是否显示箱线图顶端和末端的两条线(即上下须),默认为True。
showbox : bool类型,是否显示箱线图的箱体,默认为True。
showfilers : 是否显示异常值,默认为True。
boxprops : 设置箱体的属性,如边框色、填充色等。
labels : 为箱线图添加标签,类似图例。
filerprops : 设置异常值的属性,如异常点的形状、大小、填充色等。
medianprops : 设置中位数的属性,如线的类型、粗细等。
meanprops : 设置均值的属性,如点的大小、颜色等。
capprops : 设置箱线图顶端和末端线条的属性,如颜色、粗细等。
whiskerprops : 设置须的属性,如颜色、粗细、线的类型等。

分析一下此箱线图:
图中上下两条横线代表上下须,箱体的上下两条横线代表上下四分位数,箱体中的虚线是中位数,箱体内的点为均值,上下须两端的点代表异常值。

通过均值和中位数对比得知数据微微右偏。
(如果数据近似正态分布,则众数=中位数=均值,右偏,众数<中位数<均值,左偏,众数>中位数>均值。

上面是二手房整体单价的箱线图,不常见,常用的是分组箱线图,即二手房单价按照其他分组变量进行对比分析。

seborn模块类似,用时自己查就可以,这里不做详细介绍。

三.小提琴图

小提琴图相当于数值型数据的核密度图与箱线图融合一起,matplotlib的小提琴图不包含一个完整的箱线图,所以这里直接使用seaborn中的violinplot函数绘制小提琴图。

sns.violinplot(x=None,y=None,hue=None,data=None,order=None,hue_order=None,
bw=‘scott’,cut=2,scale=‘area’,scale_hue=True,gridsize=100,
width=0.8,inner=‘box’,split=‘box’,split=False,dodge=True,orient=None,
linewidth=None,color=None,palette=None,saturation=0.75,ax=None
)

x : x轴数据。
y : y轴数据。
hue : 指定一个分组变量。
data : 指定绘制小提琴图的数据集。
hue_order : 传递一个字符串列表,用于分类变量的排序。
bw : 制定核密度估计的带宽,带宽越大,密度曲线越平滑。
scale : 用于调整图的左右宽度,如果为area , 表示每个小提琴图的左右部分拥有相同的面积;如果为count , 则表示根据样本数量来调节宽度;如果为width , 则表示每个小提琴图左右两部分拥有相同的宽度。

scale_hue : bool类型,当使用hue参数时,是否对hue变量的每个水平做标准化处理,默认为True。
width : 使用hue参数时,用于控制小提琴图的宽度。
inner : 指定小提琴图内部数据点的形态。如果为box,则表示绘制微型的箱线图;如果为quartiles,则表示绘制四分位的分布图;如果为point或stick,则表示绘制点或小竖条。

split : bool类型,使用hue参数时,将小提琴图从中间分为两个不同的部分,默认为False。
dodge : bool类型,当使用hue参数时,是否绘制水平交错的小提琴图,默认为True。
orient : 指定小提琴图的呈现方向,默认垂直。
linewidth:指定小提琴图的所有线条宽度,。
color : 指定小提琴图的颜色,该参数与palette一起使用的时候无效。
palette : 指定hue变量的区分色。
saturation : 指定颜色的透明度。
ax : 指定子图的位置。

四.折线图

同样还是三个模块均可绘制,但seaborn中的tsplot函数用起来不方便,因此这里仅介绍matplotlib和pandas实现折线图的方法。

1.matplotlib

plt.plot(x , y , linestyle , linewidth , color , marker ,          markersize , markerergecolor , markerfactcolor ,         markeredgewidth , label , alpha)

x : 指定折线图的x轴数据。
y : 指定折线图的y轴数据。
linestyle : 指定折线图的类型,实线、虚线、点虚线、点点线等等,默认为实现。
linewidth : 指定折线的宽度。
marker : 可以为折线图添加点,该参数是设置点的形状。
markersize : 点的大小。
markeredgecolor : 点的边框色。
markerfactcolor : 点的填充色。
markeredgewidth : 点的边框宽度。
label : 为折线图添加标签,类似于图例的作用。

这里用‘-’ 表示实线,用’o’ 表示空心圆点,当然还有很多中其他的表示,这里不一一列举,用的时候直接查,然后往里面套就行。

但是上面一幅图其实是只显示了阅读人数,想要实现一张图里阅读人数和阅读人次两条曲线的比较,可以使用如下方法:

2.pandas

虽然plot 部分看起来很简单,但前提是要将表中的数据进行处理,将三条折线图的数据分别为数据框的三个字段才行,这里用到了数据框pivot_table方法,将原始的数据处理成满足条件的一张透视表。

关于pivot_table 函数的用法,其实很简单,随便搜一搜就会了!