scipy.cluster.hierarchy.

dendrogram#

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,可选

用于 truncate_modep 参数。

truncate_modestr,可选

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

None

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

'lastp'

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

'level'

树状图树最多显示 p 层。一个“层”包括所有距离最终合并 p 个合并的节点。

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

color_thresholddouble,可选

为了简洁起见,令 \(t\)color_threshold。如果 \(k\) 是低于切割阈值 \(t\) 的第一个节点,则为低于簇节点 \(k\) 的所有后代链接着色相同的颜色。连接距离大于或等于阈值的节点的所有链接都用默认的 matplotlib 颜色 'C0' 着色。如果 \(t\) 小于或等于零,则所有节点都着色为 'C0'。如果 color_threshold 为 None 或 ‘default’,与 MATLAB(TM) 行为相对应,则阈值设置为 0.7*max(Z[:,2])

get_leavesbool,可选

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

orientationstr,可选

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

'top'

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

'bottom'

将根节点绘制在底部,并绘制向上延伸的后代链接。

'left'

将根节点绘制在左侧,并绘制向右延伸的后代链接。

'right'

将根节点绘制在右侧,并绘制向左延伸的后代链接。

labelsndarray,可选

默认情况下,labels 为 None,因此使用原始观察结果的索引来标记叶子节点。否则,这是一个大小为 \(n\) 的序列,其中 n == Z.shape[0] + 1。如果 labels[i] 值对应于原始观察结果而不是非单元素簇,则该值是在第 \(i\) 个叶子节点下方放置的文本。

count_sortstr 或 bool,可选

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

False

不执行任何操作。

'ascending'True

具有最小数量的原始对象的子簇首先绘制。

'descending'

具有最大数量的原始对象的子簇首先绘制。

注意,distance_sortcount_sort 不能同时为 True。

distance_sortstr 或 bool,可选

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

False

不执行任何操作。

'ascending'True

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

'descending'

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

注意 distance_sortcount_sort 不能同时为 True。

show_leaf_countsbool,可选

如果为 True,则表示 \(k>1\) 个原始观察结果的叶子节点将用括号中的观察结果数量进行标记。

no_plotbool,可选

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

no_labelsbool,可选

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

leaf_rotationdouble,可选

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

leaf_font_sizeint,可选

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

leaf_label_funclambda 或 function,可选

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,可选

如果为 True,则收缩为叶子节点的非单元素节点的高度将以十字交叉的形式绘制在连接该叶子节点的链接上。这实际上只有在使用截断时才有用(请参阅 truncate_mode 参数)。

link_color_func可调用对象,可选

如果给出,则 link_color_function 将使用每个非单元素 ID(对应于它将绘制的每个 U 形链接)进行调用。该函数预计将返回用于绘制链接的颜色,以 matplotlib 颜色字符串代码的形式进行编码。例如

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

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

axmatplotlib Axes 实例,可选

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

above_threshold_colorstr,可选

此 matplotlib 颜色字符串设置高于颜色阈值的链接的颜色。默认值为 '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] 中的距离是单调的,否则树状图中会出现交叉。

示例

>>> 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