如何使用Matplotlib和Scipy的hierarchy模块绘制并标注分层聚类树状图
Matplotlib 基础知识
在正式介绍如何绘制和标注分层聚类树状图之前,我们需要了解一些Matplotlib的基础知识。
Matplotlib是一个数据可视化库,可用于创建各种图表,如折线图、散点图、条形图、直方图等等。 matplotlib.pyplot是Matplotlib中的一个模块,是一个命令型接口,可让您使用Mathplotlib创建许多种类的图表。
Matplotlib中有两个基本概念,即“图形”和“轴”。一个“轴”代表一个2D图形对象,其中包含了许多其他元素,如数轴、坐标轴、标签等。一个“图形”通常是指一个容器,是由多个轴组成,例如子图形。Matplotlib中可用于创建和更新轴与图形的许多种类绘图函数,例如plot()、scatter()、hist()等。
示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.show()
阅读更多:Matplotlib 教程
分层聚类树状图
分层聚类是一种聚类技术,其目标是通过递归地将观测值合并在一起来建立一棵层次结构,从而形成分层聚类树状图(也称为“树状图”)。这种方法没有”结果簇”的限制,因为每个观测对象都被包含在某个叶子中。
在Python中,Scipy库中的hierarchy模块包含用于计算和分层聚类的函数。其中,linkage()函数尤其有用,该函数计算并返回要在分层聚类中使用的链接矩阵。linkage()函数可以接受多种不同类型的指标作为参数,包括“欧几里得距离”、“曼哈顿距离”,以及“皮尔逊相关系数”。
以下例子演示了如何使用hierarchy模块计算并绘制分层聚类树:
import matplotlib.pyplot as plt
from scipy.cluster import hierarchy
import numpy as np
# 创建数据
np.random.seed(1)
x = np.random.random((10,3))
labels = list('abcdefghij')
# 计算距离矩阵
dist_matrix = hierarchy.distance.pdist(x)
# 使用最短距离法进行分层聚类
Z = hierarchy.linkage(dist_matrix, method='single')
# 绘制树状图
hierarchy.dendrogram(Z, labels=labels)
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()
上述示例使用了随机生成的10个三维数据点,然后使用hierarchy模块拟合分层聚类。
绘制和标注分层聚类树状图
虽然使用hierarchy模块可以很容易地绘制分层聚类树状图,但该图通常需要进一步标注以便更清晰地表达数据的含义。以下是如何使用matplotlib库自定义分层聚类树状图的方式。
要标记分层聚类树状图,我们需要使用Matplotlib中的annotate()函数。annotate()函数需要三个参数,即注释文本、注释箭头的起点坐标和箭头的终点坐标。
示例:
import matplotlib.pyplot as plt
from scipy.cluster import hierarchy
import numpy as np
# 创建数据
np.random.seed(1)
x = np.random.random((10,3))
labels = list('abcdefghij')
# 计算距离矩阵
dist_matrix =hierarchy.distance.pdist(x)
# 使用最短距离法进行分层聚类
Z = hierarchy.linkage(dist_matrix, method='single')
# 绘制树状图
plt.figure(figsize=(10, 5))
dn = hierarchy.dendrogram(Z, labels=labels, leaf_font_size=12)
# 标注树状图
plt.annotate('Outlier', xy=(0.8,0.1),
xytext=(0.5,0.5), fontsize=14,
arrowprops=dict(arrowstyle='->', color='gray'))
plt.annotate('Two merged clusters', xy=(3, 0),
xytext=(2, 0.8), fontsize=14,
arrowprops=dict(arrowstyle='->', color='red'))
plt.xticks([])
plt.ylabel('Distance')
plt.show()
上述示例标注了两个不同类型的标注。第一个标注使用灰色箭头指向位于距离坐标(0.8,0.1)的离群值;第二个标注使用红色箭头指向两个合并的聚类。
标注分层聚类树状图时,建议使用大于默认值的dpi和figsize参数,以增加图形的清晰度和易读性。如果需要更多的标注,可以使用多个annotate()函数来创建它们。
总结
本文介绍了如何使用Matplotlib和Scipy的hierarchy模块绘制并标注分层聚类树状图。要绘制分层聚类树状图,需要计算距离矩阵并使用hierarchy.linkage()函数拟合分层聚类。要标注树状图,可以使用Matplotlib中的annotate()函数并指定注释文本和箭头的起点和终点。
极客教程