scipy.cluster.hierarchy.

树状图#

scipy.cluster.hierarchy.dendrogram(Z, p=30, truncate_mode=None, color_threshold=None, get_leaves=True, orientation='top', labels=None, count_sort=False, distance_sort=False, show_leaf_counts=True, no_plot=False, no_labels=False, leaf_font_size=None, leaf_rotation=None, leaf_label_func=None, show_contracted=False, link_color_func=None, ax=None, above_threshold_color='C0')[source]#

绘制层次聚类为树状图。

树状图通过在非单例集群及其子集群之间绘制一个U形链接来展示每个集群是如何组成的。U形链接的顶部表示集群合并。U形链接的两个腿表示合并了哪些集群。U形链接的两条腿的长度表示子集群之间的距离。它也是两个子集群中原始观测值之间的协表距离。

参数:
Zndarray

编码层次聚类的链接矩阵,用于渲染为树状图。有关Z格式的更多信息,请参阅linkage函数。

pint, optional

truncate_modep参数。

truncate_modestr, optional

当从中导出链接的原始观察矩阵很大时,树状图可能难以阅读。截断用于压缩树状图。有几种模式

None

不执行截断(默认)。注意:'none'None的别名,为了向后兼容而保留。

'lastp'

链接中形成的最后p个非单例集群是链接中唯一的非叶节点;它们对应于Z中的行Z[n-p-2:end]。所有其他非单例集群都收缩为叶节点。

'level'

最多显示树状图树的p个级别。“级别”包括与最终合并具有p个合并的所有节点。

注意:'mtica''level'的别名,为了向后兼容而保留。

color_thresholddouble, optional

为简洁起见,设\(t\)color_threshold。如果\(k\)是低于截止阈值\(t\)的第一个节点,则将集群节点\(k\)下方的所有后代链接都着色为相同的颜色。所有连接距离大于或等于阈值的节点之间的链接都使用默认的matplotlib颜色'C0'着色。如果\(t\)小于或等于零,则所有节点都着色为'C0'。如果color_threshold为None或“default”,与MATLAB(TM)行为相对应,则阈值设置为0.7*max(Z[:,2])

get_leavesbool, optional

在结果字典中包含列表R['leaves']=H。对于每个\(i\)H[i] == j,集群节点j出现在叶子的从左到右遍历中的位置i,其中\(j < 2n-1\)\(i < n\)

orientationstr, optional

绘制树状图的方向,可以是以下任何字符串

'top'

在顶部绘制根,并绘制向下延伸的链接。(默认)。

'bottom'

在底部绘制根,并绘制向上延伸的链接。

'left'

在左侧绘制根,并绘制向右延伸的链接。

'right'

在右侧绘制根,并绘制向左延伸的链接。

labelsndarray, optional

默认情况下,labels为None,因此原始观测值的索引用于标记叶节点。否则,这是一个大小为\(n\)的序列,其中n == Z.shape[0] + 1labels[i]值是要放在第\(i\)个叶节点下的文本,前提是它对应于原始观测值而不是非单例集群。

count_sortstr or bool, optional

对于每个节点n,(视觉上,从左到右)绘制n的两个后代链接的顺序由该参数确定,该参数可以是以下任何值

False

什么也不做。

'ascending'True

首先绘制其集群中原始对象数量最少的子项。

'descending'

首先绘制其集群中原始对象数量最多的子项。

注意,distance_sortcount_sort不能同时为True。

distance_sortstr or bool, optional

对于每个节点n,(视觉上,从左到右)绘制n的两个后代链接的顺序由该参数确定,该参数可以是以下任何值

False

什么也不做。

'ascending'True

首先绘制其直接后代之间距离最小的子项。

'descending'

首先绘制其直接后代之间距离最大的子项。

注意,distance_sortcount_sort不能同时为True。

show_leaf_countsbool, optional

如果为True,则表示\(k>1\)个原始观测值的叶节点将用括号括起来的观测值数量标记。

no_plotbool, optional

如果为True,则不执行最终渲染。如果只需要为渲染计算的数据结构,或者如果matplotlib不可用,这将非常有用。

no_labelsbool, optional

如果为True,则在树状图的渲染中,叶节点旁边不会显示标签。

leaf_rotationdouble, optional

指定旋转叶标签的角度(以度为单位)。如果未指定,则旋转基于树状图中的节点数(默认为0)。

leaf_font_sizeint, optional

指定叶标签的字体大小(以磅为单位)。如果未指定,则大小基于树状图中的节点数。

leaf_label_funclambda or function, optional

leaf_label_func是可调用函数时,对于每个具有集群索引\(k < 2n-1\)的叶子。该函数应返回带有叶子标签的字符串。

索引\(k < n\)对应于原始观测值,而索引\(k \geq n\)对应于非单例集群。

例如,要用其节点ID标记单例,并用其ID,计数和不一致系数标记非单例,只需执行

# First define the leaf label function.
def llf(id):
    if id < n:
        return str(id)
    else:
        return '[%d %d %1.2f]' % (id, count, R[n-id,3])

# The text for the leaf nodes is going to be big so force
# a rotation of 90 degrees.
dendrogram(Z, leaf_label_func=llf, leaf_rotation=90)

# leaf_label_func can also be used together with ``truncate_mode``,
# in which case you will get your leaves labeled after truncation:
dendrogram(Z, leaf_label_func=llf, leaf_rotation=90,
           truncate_mode='level', p=2)
show_contractedbool, optional

如果为True,则收缩到叶节点中的非单例节点的高度将绘制为沿连接该叶节点的链接的十字。这实际上仅在使用截断时才有用(请参阅truncate_mode参数)。

link_color_funccallable, optional

如果给定,则使用每个非单例ID调用link_color_function,该ID对应于它将绘制的每个U形链接。该函数应返回要绘制链接的颜色,编码为matplotlib颜色字符串代码。例如

dendrogram(Z, link_color_func=lambda k: colors[k])

使用colors[k]对每个未截断的非单例节点k下方的直接链接进行着色。

axmatplotlib Axes 实例, optional

如果None且no_plot不是True,则树状图将绘制在当前轴上。否则,如果no_plot不是True,则树状图将绘制在给定的Axes实例上。如果树状图是更复杂图形的一部分,这将非常有用。

above_threshold_colorstr, optional

此matplotlib颜色字符串设置高于color_threshold的链接的颜色。默认为'C0'

返回:
Rdict

用于渲染树状图的数据结构的字典。它具有以下键

'color_list'

颜色名称列表。第k个元素表示第k个链接的颜色。

'icoord''dcoord'

它们都是列表的列表。设icoord = [I1, I2, ..., Ip],其中Ik = [xk1, xk2, xk3, xk4],并且dcoord = [D1, D2, ..., Dp],其中Dk = [yk1, yk2, yk3, yk4],则绘制的第k个链接为(xk1, yk1) - (xk2, yk2) - (xk3, yk3) - (xk4, yk4)

'ivl'

对应于叶节点的标签列表。

'leaves'

对于每个i,H[i] == j,集群节点j出现在叶子的从左到右遍历中的位置i,其中\(j < 2n-1\)\(i < n\)。如果j小于n,则第i个叶节点对应于原始观测值。否则,它对应于非单例集群。

'leaves_color_list'

颜色名称列表。第k个元素表示第k个叶子的颜色。

注意事项

预计Z[:,2]中的距离是单调的,否则树状图中会出现交叉。

dendrogram除了NumPy之外,还对Python Array API Standard兼容后端提供实验性支持。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供CuPy、PyTorch、JAX或Dask数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参见对数组API标准的支持

示例

>>> import numpy as np
>>> from scipy.cluster import hierarchy
>>> import matplotlib.pyplot as plt

一个非常基本的例子

>>> ytdist = np.array([662., 877., 255., 412., 996., 295., 468., 268.,
...                    400., 754., 564., 138., 219., 869., 669.])
>>> Z = hierarchy.linkage(ytdist, 'single')
>>> plt.figure()
>>> dn = hierarchy.dendrogram(Z)

现在,在给定的轴中绘制,改进配色方案,并同时使用垂直和水平方向

>>> hierarchy.set_link_color_palette(['m', 'c', 'y', 'k'])
>>> fig, axes = plt.subplots(1, 2, figsize=(8, 3))
>>> dn1 = hierarchy.dendrogram(Z, ax=axes[0], above_threshold_color='y',
...                            orientation='top')
>>> dn2 = hierarchy.dendrogram(Z, ax=axes[1],
...                            above_threshold_color='#bcbddc',
...                            orientation='right')
>>> hierarchy.set_link_color_palette(None)  # reset to default after use
>>> plt.show()
../../_images/scipy-cluster-hierarchy-dendrogram-1_00.png
../../_images/scipy-cluster-hierarchy-dendrogram-1_01.png