树状图#
- 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')[源代码]#
将层次聚类绘制为树状图。
树状图通过在非单例簇及其子簇之间绘制 U 形链接来演示每个簇的构成方式。 U 形链接的顶部表示簇合并。 U 形链接的两条腿表示合并了哪些簇。 U 形链接的两条腿的长度表示子簇之间的距离。 它也是两个子簇中原始观测值之间的协表距离。
- 参数:
- Zndarray
链接矩阵,编码要渲染为树状图的层次聚类。 有关
Z
格式的更多信息,请参见linkage
函数。- pint, 可选
truncate_mode
的p
参数。- 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,绘制 n 的两个子代链接的顺序(在视觉上,从左到右)由该参数决定,该参数可以是以下任何值
False
不执行任何操作。
'ascending'
或True
首先绘制群集中原始对象数量最少的子节点。
'descending'
首先绘制群集中原始对象数量最多的子节点。
请注意,
distance_sort
和count_sort
不能同时为 True。- distance_sortstr 或 bool, 可选
对于每个节点 n,绘制 n 的两个子代链接的顺序(在视觉上,从左到右)由该参数决定,该参数可以是以下任何值
False
不执行任何操作。
'ascending'
或True
首先绘制其直接子代之间距离最小的子节点。
'descending'
首先绘制其直接子代之间距离最大的子节点。
请注意,
distance_sort
和count_sort
不能同时为 True。- show_leaf_countsbool, 可选
为 True 时,表示 \(k>1\) 个原始观测值的叶节点会用它们包含的观测值数量(以括号括起来)进行标记。
- no_plotbool, 可选
当为 True 时,不执行最终渲染。 如果仅需要为渲染计算的数据结构,或者如果 matplotlib 不可用,则此方法很有用。
- no_labels布尔值, 可选
当为 True 时,树状图渲染中叶节点旁边不会显示标签。
- leaf_rotation双精度浮点数, 可选
指定叶标签旋转的角度(以度为单位)。如果未指定,则旋转角度基于树状图中的节点数(默认为 0)。
- leaf_font_size整数, 可选
指定叶标签的字体大小(以磅为单位)。如果未指定,则大小基于树状图中的节点数。
- leaf_label_funclambda 或函数, 可选
当
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_contracted布尔值, 可选
当为 True 时,被收缩为叶节点的非单例节点的高度将以十字形标记在连接该叶节点的连线上。这只有在使用截断时才真正有用(请参阅
truncate_mode
参数)。- link_color_func可调用对象, 可选
如果给定,将使用每个与要绘制的 U 形连线对应的非单例 ID 调用 link_color_function。该函数应返回绘制连线的颜色,编码为 matplotlib 颜色字符串代码。例如
dendrogram(Z, link_color_func=lambda k: colors[k])
使用
colors[k]
为每个未截断的非单例节点k
下方的直接连线着色。- axmatplotlib Axes 实例, 可选
如果为 None 且 no_plot 不为 True,则树状图将绘制在当前坐标轴上。否则,如果 no_plot 不为 True,则树状图将绘制在给定的
Axes
实例上。当树状图是更复杂图形的一部分时,这可能很有用。- above_threshold_color字符串, 可选
此 matplotlib 颜色字符串设置颜色阈值以上的连线的颜色。默认值为
'C0'
。
- 返回:
- R字典
一个用于渲染树状图的计算数据结构的字典。它具有以下键
'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()