树状图#
- 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_mode
的p
参数。- 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] + 1
。labels[i]
值是要放在第\(i\)个叶节点下的文本,前提是它对应于原始观测值而不是非单例集群。- count_sortstr or bool, optional
对于每个节点n,(视觉上,从左到右)绘制n的两个后代链接的顺序由该参数确定,该参数可以是以下任何值
False
什么也不做。
'ascending'
或True
首先绘制其集群中原始对象数量最少的子项。
'descending'
首先绘制其集群中原始对象数量最多的子项。
注意,
distance_sort
和count_sort
不能同时为True。- distance_sortstr or bool, optional
对于每个节点n,(视觉上,从左到右)绘制n的两个后代链接的顺序由该参数确定,该参数可以是以下任何值
False
什么也不做。
'ascending'
或True
首先绘制其直接后代之间距离最小的子项。
'descending'
首先绘制其直接后代之间距离最大的子项。
注意,
distance_sort
和count_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()