【问题标题】:Plotting tf-idf matrix on a 2-dimensional space在二维空间上绘制 tf-idf 矩阵
【发布时间】:2019-01-08 13:28:03
【问题描述】:

早上好, 我使用 tf idf 矩阵进行 k-means 聚类,以便在歌曲文本中找到重复出现的主题。 最后我得到了4个集群。我使用以下代码进行绘图:

from sklearn.manifold import TSNE
from sklearn.decomposition import TruncatedSVD
k = 4
tfs_reduced = TruncatedSVD(n_components=k, random_state=7).fit_transform(tfidf_matrix)
tfs_embedded = TSNE(n_components=2).fit_transform(tfs_reduced)

fig = plt.figure(figsize = (10, 10))
ax = plt.axes()
plt.scatter(tfs_embedded[:, 0], tfs_embedded[:, 1], c=labels)
plt.show()

绘图似乎是正确的,但我无法添加一个图例,其中使用的每种颜色都分配给特定的集群。 我该怎么办?

【问题讨论】:

    标签: python matplotlib scatter-plot tf-idf


    【解决方案1】:

    我认为您的代码存在两个问题。

    1. 首先,您需要为要绘制的每个集群调用一次 scatter()。由于您没有包含重现 tfs_embedded 变量所需的所有代码,因此我不知道您的情况会涉及什么。不过,据推测,您可以将该数据细分为对 scatter 函数的多次调用。
    2. 第二个问题是您需要从坐标区调用 scatter,而不是从绘图(即 ax.scatter 而不是 plt.scatter)。

    下面的示例代码将向您展示这是如何工作的。输出图为here

    import matplotlib.pyplot as plt
    
    x = [1,2,4,3,7,5]
    y = [2.2,1.0,0.8,8.6,3.6,7.8]
    C1 = 'red'
    C2 = 'blue'
    L1 = "Cluster 1"
    L2 = "Cluster 2"
    fig = plt.figure(figsize = (10, 10))
    ax = plt.axes()
    ax.scatter(x[0:3], y[0:3], label=L1, c=C1, edgecolors='none')
    ax.scatter(x[3:6], y[3:6], label=L2, c=C2, edgecolors='none')
    ax.legend()
    plt.show()
    

    【讨论】:

    • 其实这种情况下scatter可以从plt调用。然后颜色参数可以是一维数组,第 i 个元素是第 i 个 x 点的颜色。此外,legend 可以称为表格绘图。我会争辩说,在这种情况下,使用 pyplot 而不是使用轴会更加pythonic。此外,无需设置fig 对象。
    • 好收获。如果是这种情况,那么解决 OP 问题的基本方法是使用不同的标签多次调用 scatter 。我认为 OP 不希望每个点都使用不同的颜色,而是将多个点分组为“集群”,每个集群使用一种颜色,如链接的示例图所示。
    • 另外,当我从 plt 调用 scatter 时,簇的颜色是正确的,但图例条目都具有相同的颜色。我认为这就是为什么从轴上调用似乎很重要的原因。但也许我错过了什么。
    • 查看 matplotlib 文档后,他们使用循环来表示每一类点,所以我想这是预期的方法。正如您所说,需要为每个集群调用plt.scatter()。我最初的评论错过了对多类图例支持的需要!
    • 我很想知道我的回答是否适用于 OP ChiaraA。
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2016-05-08
    • 2014-07-22
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多