导读:柱状图是当前应用最广泛的图表之一,你几乎每天都可以在电子产品上看到它。它有哪些分类?可以展示哪些数据关系?怎样用Python绘制?本文带你逐一了解。
作者:屈希峰,资深Python工程师,知乎多个专栏作者
来源:大数据DT(ID:hzdashuju)
01 概述
柱状图(Histogram)是一种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或两个以上的价值(不同时间或者不同条件),只有一个变量,通常用于较小的数据集分析。
柱状图也可横向排列,或用多维方式表达。其主要用于数据统计与分析,早期主要用于数学统计学科中,用柱状图表示数码相机的曝光值,到现代使用已经比较广泛,比如现代的电子产品和一些软件的分析测试,如电脑、数码相机的显示器和Photoshop上都能看到相应的柱状图。
1. 基础柱状图
基础柱状图经常用来对比数值的大小,使用范围非常广泛,例如科比在不同赛季的得分、不同游戏App下载量、不同时期手机端综合搜索用户规模等,图2-33显示不同种类水果的销量。
▲图2-33 基本柱状图
需要注意的是,分类太多不适合使用竖向柱状图,如图2-34所示。
▲图2-34 竖向柱状图
此时,需要用到横向柱状图,如图2-35所示。
▲图2-35 横向柱状图
2. 分组柱状图
分组柱状图,又叫聚合柱状图。当使用者需要在同一个轴上显示各个分类下不同的分组时,需要用到分组柱状图。
跟柱状图类似,使用柱子的高度来映射和对比数据值。每个分组中的柱子使用不同颜色或者相同颜色不同透明的方式区别各个分类,各个分组之间需要保持间隔。
分组柱状图经常用于不同组间数据的比较,这些组都包含了相同分类的数据。例如,展示改革开放以来城镇与农村人口的变化,不同游戏公司的休闲、益智、格斗类App的下载量对比等。图2-36对比了2015—2017年间不同水果的销量。
▲图2-36 分组柱状图
3. 堆叠柱状图
与并排显示分类的分组柱状图不同,堆叠柱状图将每个柱子进行分割以显示相同类型下各个数据的大小情况。它可以形象地展示一个大分类包含的每个小分类的数据,以及各个小分类的占比,显示的是单个项目与整体之间的关系。我们将堆叠柱状图分为两种类型:
1)一般的堆叠柱状图:每一根柱子上的值分别代表不同的数据大小,各层的数据总和代表整根柱子的高度。非常适用于比较每个分组的数据总量。
2)百分比的堆叠柱状图:柱子的各个层代表的是该类别数据占该分组总体数据的百分比。
堆叠柱状图的一个缺点是当柱子上的堆叠太多时会导致数据很难区分对比,同时很难对比不同分类下相同维度的数据,因为它们不是按照同一基准线对齐的。
图2-37是显示2015—2017年间不同水果的累计数量。
▲图2-37 堆叠柱状图
4. 双向柱状图
双向柱状图,又名正负条形图,使用正向和反向的柱子显示类别之间的数值比较。其中分类轴表示需要对比的分类维度,连续轴代表相应的数值,分为两种情况,一种是正向刻度值与反向刻度值完全对称,另一种是正向刻度值与反向刻度值反向对称,即互为相反数。
图2-38是显示2015—2017年间不同水果的进出口数量。
▲图2-38 双向柱状图
5. 瀑布图
瀑布图是由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水而称之为瀑布图(Waterfall Plot)。此种图表采用绝对值与相对值结合的方式,适用于表达数个特定数值之间的数量变化关系。图2-39显示历年短跑冠军的时间跨度,由此可以看出人类体能极限越来越高了。
▲图2-39 瀑布图
接下来,我们看看如何用Bokeh依次实现这些柱状图。
02 实例
柱状图代码示例如下所示。
代码示例 2-27
1p = figure(plot_width=400, plot_height=400)
2p.vbar(x=[1, 2, 3], width=0.5, bottom=0,
3 top=[1.2, 2.5, 3.7], color="red") # 垂直柱状图
4show(p) # 显示
运行结果如图2-40所示。
▲图2-40 代码示例2-27运行结果
代码示例2-27第2行采用vbar()方法实现垂直柱状图,该方法具体的参数说明如下。
p.vbar(x, width, top, bottom=0, **kwargs)参数说明。
x (:class:`~bokeh.core.properties.NumberSpec` ) : 柱中心x轴坐标
width (:class:`~bokeh.core.properties.NumberSpec` ) : 柱宽
top (:class:`~bokeh.core.properties.NumberSpec` ) : 柱顶部y轴坐标
bottom (:class:`~bokeh.core.properties.NumberSpec` ) : 柱底部y轴坐标
代码示例 2-28
1p = figure(plot_width=400, plot_height=400)
2p.hbar(y=[1, 2, 3], height=0.5, left=0,
3 right=[1.2, 2.5, 3.7], color="navy") # 水平柱状图
4show(p) # 显示
运行结果如图2-41所示。
▲图2-41 代码示例2-28运行结果
代码示例2-28第2行采用hbar()方法实现横向柱状图,该方法具体的参数说明如下。
p.hbar(y, height, right, left=0, **kwargs)参数说明。
y (:class:`~bokeh.core.properties.NumberSpec` ) : 柱中心y轴坐标
height (:class:`~bokeh.core.properties.NumberSpec` ) :柱的高度(宽度)
right (:class:`~bokeh.core.properties.NumberSpec` ) :柱右侧边界x轴坐标
left (:class:`~bokeh.core.properties.NumberSpec` ) :柱左侧边界x轴坐标