Python数据可视化之美:专业图表绘制指南(全彩)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 类别比较型图表

4.1 柱形图系列

柱形图用于显示一段时间内的数据变化或显示各项之间的比较情况。在柱形图中,类别型或序数型变量映射到横轴的位置,数值型变量映射到矩形的高度。控制柱形图的两个重要参数是:“系列重叠”和“分类间距”。“分类间距”控制同一数据系列的柱形宽度,数值范围为[0.0,1.0];“系列重叠”控制不同数据系列之间的距离,数值范围为[-1.0,1.0]。图4-1-1为使用plotnine的geom_bar()函数直接绘制的柱形图系列,包括单数据系列柱形图、多数据系列柱形图、堆积柱形图和百分比堆积柱形图共4种常见类型。但是,绘制柱形图和条形图系列的最大潜在问题就是排序。

图4-1-1 柱形图系列

用plotnine绘制的柱形图,X轴变量默认会按照输入的数据顺序绘制,Y轴变量和图例变量默认按照字母顺序绘制。所以使用Python绘制柱形图系列图表时要注意:绘制图表前要对数据进行排序处理(见图4-1-2)。在使用geom_bar()函数绘制柱形图系列时,position的参数有4种:① identity:不做任何位置调整,该情况在多分类柱形图中不可行,各序列会互相遮盖,但是在多序列散点图、折线图中可行,不会存在遮盖问题;② stack:垂直堆叠放置(堆积柱形图);③ dodge:水平抖动放置(簇状柱形图,position=position_dodge());④ fill:百分比化(垂直堆叠放置,如百分比堆积面积图、百分比堆积柱形图等)。

图4-1-2 排序调整后的柱形图系列

4.1.1 单数据系列柱形图

图4-1-1(a)和图4-1-2(a)分别对应排序调整前和调整后的单数据系列柱形图。如前面所说,数据类型大致可以分为:类别型、序数型和数值型。柱形图的X轴变量一般为类别型和序数型,Y轴变量为数值型。对于X轴变量为序数型的情况,直接按顺序绘制柱形图,图4-1-1(a)的X轴为Fair、Good、Very Good、Premium和Ideal(一般、好、非常好、超级好、完美)的顺序。最常见的序数型数据还包括时序数据,如年、月("January"、"February"、"March"、"April"、"May"、"June"、"July"、"August"、"September"、"October"、"November"、"December")、日期等。

但是,如果X轴变量为类别型数据,则一般推荐先对数据进行降序处理,再展示图表,如图4-1-2(a)所示(假定图4-1-2(a)的X轴变量为类别型)。这样,更加方便观察数据规律,确定某个类别对应的数值在整个数据范围的位置。

对于X轴变量为类别型的数据,在使用plotnine包的函数绘图时,会默认把X轴类别按照字母顺序绘制柱形,如图4-1-1(a)所示。这是因为绘图不是根据X轴变量的分类数据顺序排列展示的,而是根据分类数据的类别(categories)按顺序展示。分类数据包括列表和类别(categories)两个部分,比如:

最终的输出结果Cut为:列表部分[Premium,Fair,Very Good,Good,Ideal];类别部分[Fair,Good,Ideal,Premium,Very Good],其中类别部分会根据字母顺序自动排序。

需要注意的是,只排序数据框,而不改变X轴分类数据的类别(categories),并不会改变柱形图的绘制顺序。Python的dataframe.sort_values()函数可以对数据框(data.frame)根据某列数据排序,具体语句如下:

通过上述语句可以得到图4-1-3(b)所示的新表格,虽然对表格数据重新排序,但是并没有改变分类数据的类别(categories)。我们在使用geom_bar()函数绘制时,还是根据类别的原有顺序绘制的柱形图,如图4-1-1(a)所示。

在plotnine包中,要实现X轴变量的降序展示(见图4-1-2(a)),需要通过控制并改变分类数据的类别实现。我们一定要先对表格或分类数据排序后,再改变其类别,才会使X轴的类别顺序根据Y轴变量的数值降序展示,具体语句如下:

其中,Sort_data['Cut'].values.categories为Index(['Premium','Fair','Very Good','Good','Ideal'],dtype='object',name='Cut');Sort_data['Cut'].values.codes为array([0,1,2,3,4],dtype=int8)。在这里,Sort_data['Cut']中原来的categories为[Fair,Good,Ideal,Premium,Very Good],而使用上面的语句处理后,新的categories为[Premium<Fair<Very Good<Good<Ideal],绘制图表时会根据Sort_data['Cut']中水平(level)的顺序绘制柱形数据系列,如图4-1-2(a)所示。

图4-1-3 Python中原始数据的展示

技能 绘制单数据系列柱形图

plotnine包提供了绘制柱形图系列图表的函数:geom_bar()。其中stat和position的参数都为identity,width控制柱形的宽度,范围为(0,1)。柱形图中最重要的美学参数就是柱形的宽度。图4-1-2(a)单数据系列柱形图的实现代码如下所示。

使用matplotlib包绘制柱形图时,会直接按照表格中的数据系列顺序绘制,并不涉及分类数据的类别(categories)的处理,其具体代码如下所示。

由于plotnine包不能实现极坐标系,所以matplotlib包的柱形图绘制方法还是需要掌握的,在后面讲解极坐标系下的柱形图系列图表的绘制时需要使用。

4.1.2 多数据系列柱形图

对于图4-1-1(b)和图4-1-2(b)所示的多数据系列柱形图,图表绘制的关键在于将原始数据的二维表(见图4-1-4(a))转换成一维表(见图4-1-4(b))。对于多数据系列柱形图,最好先将表格根据第1个数据系列的数值进行降序处理,再进行展示。在图4-1-4(b)中,根据数据第1个系列“1996”降序展示表格,所以要使用sort_values()函数和melt()函数处理表格。

图4-1-4 表格类型的转换

技能 绘制多数据系列柱形图

plotnine包提供了绘制柱形图系列的函数geom_bar(),其中width控制柱形的宽度;position设置为'dodge',表示柱形并排展示;也可以通过设置position_dodge(width=0.7),改变两个数据系列的间隔。图4-1-2(b)多数据系列柱形图的具体实现代码如下所示。

在matplotlib包中可以使用plt.bar()函数绘制多数据系列柱形图。相比plotnine需要使用一维表数据绘制图表,matplotlib则需要使用二维表数据绘制图表,所以需要依次使用plt.bar()函数绘制多个数据系列的柱形。由于matplotlib的二维图表使用数值型坐标轴,所以需要先根据数值型坐标轴设定每个数据系列的位置,然后使用plt.xticks()函数将数值型坐标轴的标签替换成类别文本型,从而构造类别型坐标轴。因此,在绘制多数据系列柱形图时,matplotlib的语法就显得比plotnine冗余很多,具体实现代码如下所示。

4.1.3 堆积柱形图

堆积柱形图显示单个项目与整体之间的关系,它比较各个类别的每个数值所占总数值的大小。堆积柱形图以二维垂直堆积矩形显示数值。在图4-1-2(c)中,要注意以下三点:

(1)柱形图的X轴变量一般为类别型,Y轴变量为数值型。所以要先求和得到每个类别的总和数值,然后对数据进行降序处理。

(2)如果图例的变量属于序数型,如Fair、Good、Very Good、Premium和Ideal(一般、好、非常好、超级好、完美)属于有序型,则需要按顺序显示图例。

(3)如果图例的变量属于无序型,则最好根据其均值排序,使数值最大的类别放置在最下面,最靠近X轴,这样很容易观察每个堆积柱形内部的变量比例。

技能 绘制堆积柱形图

将plotnine中的柱形图系列图表绘制函数geom_bar()的参数position设置为"stack",就可以绘制堆积柱形图。图4-1-2(c)堆积柱形图的具体实现代码如下所示。

在matplotlib中可以使用plt.bar()函数绘制堆积柱形图。在绘制堆积柱形图时,matplotlib的语法依旧显得比plotnine冗余很多,需要依次使用plt.bar()函数绘制每个数据系列,而且需要设置bottom参数(前几个数据系列的累加数值),语法极其麻烦,具体代码如下所示。

4.1.4 百分比堆积柱形图

百分比堆积柱形图和三维百分比堆积柱形图表达相同的图表信息。这些类型的柱形图比较各个类别的每一个数值所占总数值的百分比大小。百分比堆积柱形图以二维垂直百分比堆积矩形显示数值。在图4-1-2(d)中,要注意以下三点:

(1)柱形图的X轴变量一般为类别型,Y轴变量为数值型。所以要先求出重点想展示类别的占比(如Ideal数据系列,一般推荐为占比最大的数据系列),然后对数据进行降序处理。

(2)如果图例的变量属于序数型,如Fair、Good、Very Good、Premium和Ideal(一般、好、非常好、超级好、完美)即为有序型,则需要按顺序显示图例。

(3)如果图例的变量属于无序型,则最好根据其平均占比排序,使占比最大的类别放置在最下面,最靠近X轴,这样很容易观察每个类别间的变量占比变化。

技能 绘制百分比堆积柱形图

将plotnine包中的柱形图系列图表绘制函数geom_bar()的参数position设置为"fill",就可以绘制百分比堆积柱形图。图4-1-2(d)百分比堆积柱形图的具体实现代码如下所示。

在matplotlib包中可以使用plt.bar()函数绘制百分比堆积柱形图。在绘制百分比堆积柱形图时,matplotlib的语法依旧显得比plotnine冗余很多,需要先计算多数据系列的数据,转换成每个类别的百分比数据,然后依次使用plt.bar()函数绘制每个数据系列,而且需要设置bottom参数(前几个数据系列的累加数值)。最后还需要设置Y轴的标签格式为百分比形式,语法极其麻烦,具体代码如下所示。