dendrogram绘图为空的主因是输入非linkage矩阵;须先用linkage(x)生成z再传入,且x需为二维数组,pdist结果不可直用。

scipy.cluster.hierarchy.dendrogram 绘制失败:没报错但图是空的
常见原因是传给 dendrogram 的输入不是正确的链接矩阵(linkage matrix),而是原始数据或聚类标签。它只接受 scipy.cluster.hierarchy.linkage 输出的结果,不能直接喂 X 或 labels。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须先调用
linkage,比如Z = linkage(X, method='ward'),再把Z传给dendrogram - 原始数据
X需是二维数组,形状为(n_samples, n_features);若用了sklearn的标准化,记得先fit_transform再传给linkage - 避免用
scipy.spatial.distance.pdist的返回值直接画图——它输出的是压缩距离向量,不是链接矩阵,得先过一遍linkage
中文标签乱码、字体不显示
Matplotlib 默认不支持中文,dendrogram 的叶子节点文字(leaf labels)会变成方块或空白。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在绘图前加两行:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']和plt.rcParams['axes.unicode_minus'] = False - 如果用 Jupyter,确保系统已安装对应字体;Linux 用户常缺
simhei.ttf,可手动复制或改用DejaVu Sans - 不要依赖
plt.xlabel或plt.title的字体设置——dendrogram的 leaf label 是独立渲染的,必须靠全局 rcParams
树状图太挤、标签重叠看不清
样本数一过 50,dendrogram 默认布局就糊成一片,尤其叶子节点横向堆叠,根本分不清谁是谁。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
truncate_mode='level'+p=3(只显示到第 3 层)压缩结构,适合大样本预览 - 设
leaf_rotation=90让标签竖排,配合leaf_font_size=8控制字号 - 必要时关掉叶子标签:
no_labels=True,改用ax.set_xticks手动标关键样本索引 - 注意:调整
figsize要同步放大宽度(如(12, 6)),光拉高没用
想高亮某几个簇,但 color_threshold 不生效
color_threshold 看似能自动上色,实际只按“切割高度”切一刀,所有高于它的分支强制同色,无法指定某几个簇用红、某几个用蓝。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
color_threshold本质是画一条水平线,线上分支变色,线下保持原色;它的单位是链接矩阵里的距离值,不是簇编号 - 真要自定义颜色,得放弃
color_threshold,改用link_color_func参数,写个函数根据idx返回颜色字符串(如'red') - 注意:该函数接收的是链接矩阵行索引(从 0 开始),不是样本 ID;若想按最终簇归属着色,得先用
fcluster(Z, t=k, criterion='maxclust')反推每个叶节点属于哪簇
真正难的不是画出来,是让树讲清楚你想要的结构——距离尺度、截断逻辑、颜色映射,三者稍不匹配,图就变成装饰品。别信默认参数,每个 **kwargs 都得亲手试过才敢发给别人看。










