树状图亦称为树枝状图,是一种通过树状结构描述父子成员层次结构的图形。树形图的形状一般是一个上下颠倒的树,其根部是一个没有父成员的根节点,之后从根节点开始用线连接子成员,使子成员变为子节点,直至线的末端为没有子成员的树叶节点为止。树形图用于说明成员之间的关系和连接,常见于分类学、进化科学、企业组织管理等领域。例如,frog 技术专家 Paul Adams 设计的人工智能树状图(部分)如图 8-19 所示。从图 8-19 可以看出,树状图的树叶节点经过第一层聚类形成两个类簇,即自然语言处理和机器学习,之后经过第二层聚类形成一个类簇——人工智能。树状图的绘制需要准备聚类数据。单独使用 matplotlib 较为烦琐,因此这里可以结合 scipy 包的功能完成。scipy 是一款基于 numpy 的、专为科学和工程设计的、易于使用的Python 包,它提供了线性代数、傅里叶变换、信号处理等丰富的功能。scipy.cluster 模块中包含众多聚类算法,主要包括矢量量化和层次聚类两种,并分别封装到 vq 和 hierarchy 模块中。hierarchy 模块中提供了一系列聚类的功能,可以轻松生成聚类数据并绘制树状图。下面介绍 hierarchy 模块的常用函数。1.dendrogram() 函数dendrogram() 函数用于将层次聚类数据绘制为树状图,其语法格式如下所示 :dendrogram(Z, p=30, truncate_mode=None, color_threshold=None,get_leaves=True, orientation='top', labels=None,count_sort=False, distance_sort=False,
该函数常用参数的含义如下。·Z :表示编码层次聚类的链接矩阵。·truncate_mode :表示截断的模式,用于压缩因观测矩阵过大而难以阅读的树状图,可以取值为 None(不执行截断,默认)、'lastp'、'level'。·color_threshold :表示颜色阈值。·labels :表示节点对应的文本标签。2.linkage() 函数linkage() 函数用于将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类,其语法格式如下所示 :linkage(y, method='single', metric='euclidean', optimal_ordering=False)该函数常用参数的含义如下。(1) y :可以是一维距离向量或二维的坐标矩阵。(2) method :表示计算类簇之间距离的方法,常用的取值可以为 'single'、'complete'、'average' 和 'ward',各取值具体含义如下。·'single' :表示将类簇与类簇之间最近的距离作为类簇间距。·'complete' :表示将类簇与类簇之间最远的距离作为类簇间距。·'average' :表示将类簇与类簇之间的平均距离作为类簇间距。·'ward' :表示将每个类簇的方差最小化作为类簇间距。linkage() 函数会返回编码层次聚类的链接矩阵。美国对各州的谋杀、暴力、爆炸等犯罪案件的数量进行了统计,并将统计后的结果整理
到 USArrests.xlsx 文件中。下面使用 pandas 读取 USArrests.xlsx 文件的数据,并将犯罪案例数量相似度高的州进行聚类后绘制一个树状图,示例代码如下。In [9]:import pandas as pdimport matplotlib.pyplot as pltimport scipy.cluster.hierarchy as shcplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedf = pd.read_excel(r'C:\Users\admin\Desktop\USArrests.xlsx')plt.figure(figsize=(10, 6), dpi= 80)plt.title(" 美国各州犯罪案件的树状图 ", fontsize=12)# 绘制树状图dend = shc.dendrogram(shc.linkage(df[['Murder', 'Assault', 'UrbanPop']],method='ward'), labels=df.State.values, color_threshold=100)plt.xticks(fontsize=10.5)plt.ylabel(' 案例数量 ')plt.show()由图 8-20 可知,美国各州的犯罪案件经过聚类形成若干个簇。
8.10 绘制华夫饼图
华夫饼图亦称为直角饼图,它是饼图的变体,可以直观展示部分与整体的比例。华夫饼图一般由 100 个方格组成,其中每个方格代表 1 % ,方格不同的颜色代表不同的分类,常见于比较同类型指标完成比例的场景,例如电影上座率、公司业务实际完成率等。某影院统计matplotlib 中并未提供华夫饼图的绘制函数,但可以结合 pywaffle 包绘制华夫饼图。下面介绍 pywaffle 包的安装和使用方法。1.pywaffle 的安装开发者可以直接使用 pip 命令安装 pywaffle 包。打开命令提示符工具,在提示符的后面输入如下命令 :pip install pywaffle以上命令执行后,若命令提示符窗口出现如下字样,说明 pywaffle 包安装完成 :Installing collected packages: pywaffleSuccessfully installed pywaffle-0.4.1安装完成后,在提示符的后面输入 python,之后输入如下导入语句进行验证 :from pywaffle import Waffle执行以上语句后,若命令提示符窗口没有出现任何错误信息,说明 pywaffle 安装成功,否则说明安装失败。2.pywaffle 的使用pywaffle 是 Python 中专门绘制华夫饼图的包,它提供了一个继承自 Figure 的子类 Waffle,通过将 Waffle 类传递给 figure() 函数的 FigureClass 参数即可创建华夫饼图。figure() 函数中创建华夫饼图的常用参数的含义如下。·FigureClass :可以是 Figure 类或 Figure 子类。·rows :表示华夫饼图的行数。
·columns :表示华夫饼图的列数。·values :表示数据,可以接收数组或字典。若 values 参数接收一个字典,则将字典的键作为华夫饼图的图例项。·colors :表示每个分类数据的颜色列表。·vertical :表示是否按垂直方向绘制华夫饼图,默认为 False。·title :表示标题,可以接收一个字典,其中字典的键为 title() 函数的关键字参数。·legend :表示图例,可以接收一个字典,其中字典的键为 legend() 函数的关键字参数。例如,创建一个 10 行 10 列的华夫饼图,具体代码如下。plt.figure(FigureClass=Waffle, # 指定画布类为 Wafflerows=10, # 行数设为 10columns=10, # 列数设为 10values=[45, 55] # 一组数据)假设某影院于周六上映了电影《少年的你》,并统计了 1 号观影厅的上座率。下面结合matplotlib 和 pywaffle 绘制一个说明 1 号厅上座率的华夫饼图,示例代码如下。In [10]:import matplotlib.pyplot as pltfrom pywaffle import Waffleplt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = False# 绘制华夫饼图plt.figure(FigureClass=Waffle, rows=10, columns=10,values=[95, 5],vertical=True, colors=['#20B2AA', '#D3D3D3'],title={'label': ' 电影 《少年的你》 上座率 '},legend={'loc': 'upper right', 'labels': [' 占座 ', ' 空座 ']})plt.show()
图 8-22 中华夫饼图总共由 100 个方格组成,其中绿色的方格代表上座的比例,灰色的方格代表空座的比例。由图 8-22 可知,电影《少年的你》的上座率为 95%。
8.11 本章小结本章主要介绍了如何使用 matplotlib 绘制一些高级图表,包括等高线图、矢量场流线图、棉棒图、哑铃图、甘特图、人口金字塔图、漏斗图、桑基图、树状图、华夫饼图。通过学习本章的内容,希望大家可以了解常用的高级图表的特点,并可以绘制高级图表。