SciPy 树状图绘图

Posted

技术标签:

【中文标题】SciPy 树状图绘图【英文标题】:SciPy Dendrogram Plotting 【发布时间】:2020-06-06 04:27:05 【问题描述】:

我正在玩分层文档集群,实际上我的工作流程几乎是这样的:

df = pandas.read_csv(file, delimiter='\t', index_col=0) # documents-terms matrix (very sparse)
dist_matrix = cosine_similarity(df)

linkage_matrix = ward(dist_matrix)
labels = fcluster(linkage_matrix, 5, criterion='maxclust')

然后我希望得到 5 个集群,但是当我绘制树状图时

fig, ax = plt.subplots(figsize=(15, 20))  # set size
    ax = dendrogram(linkage_matrix, orientation="right")
    plt.tick_params( \
        axis='x',  # changes apply to the x-axis
        which='both',  # both major and minor ticks are affected
        bottom='off',  # ticks along the bottom edge are off
        top='off',  # ticks along the top edge are off
        labelbottom='off')

    plt.tight_layout()  # show plot with tight layout

    plt.savefig('ward_clusters.png', dpi=200)  # save figure as ward_clusters

我得到以下图表

根据颜色,我可以看到 3 个集群,而不是 5 个!我误解了树状图的含义吗?

【问题讨论】:

【参考方案1】: 首先,如果你只想做5个集群,就用labels(你没用fcluster的那一行)。

在标签中:数据集中的每个点都由一个数字表示。这些数字是集群的 ID。

如果您想使用树状图并绘制 5 个不同的聚类,则必须“剪切”您的树状图。

在 x=5(大约 5)处画一条垂直线,考虑左侧的每个树状图都是独立的。

人工将树状图切割成 5 个部分(或 5 个簇)。

要添加一些颜色来区分它们,只需修改以下代码(由于您没有提供数据集,我使用 iris 数据集向您展示了一种可能的解决方案)

from scipy.cluster.hierarchy import *
from sklearn.datasets import load_iris
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

iris= load_iris()

data = iris['data']
df = pd.DataFrame(data, columns = iris['feature_names'])

# Somehow, we have something equivalent to work with now
dist_matrix = cosine_similarity(df)
linkage_matrix = ward(dist_matrix)

fig, ax = plt.subplots(figsize=(20, 10))

#here just put 5 for the color_threshold, which correspond to the position of the vertical line
ax = dendrogram(linkage_matrix, color_threshold =0.7)

plt.tick_params( \
    axis='x',
    which='both',
    bottom='off',
    top='off',
    labelbottom='off')

plt.show()

【讨论】:

以上是关于SciPy 树状图绘图的主要内容,如果未能解决你的问题,请参考以下文章

带有名称的 Scipy 树状图

在 Scipy 错误中为大型数据集绘制树状图

在距离高度从 SciPy 切割树状图/聚类树

2 树状图 + 来自 scipy 的压缩相关矩阵的热图

我如何获得由 scipy.cluster.hierarchy 制作的树状图的子树

显示scipy树状图的簇标签