散点图通过颜色matplotlib python隔离簇

时间:2013-11-08 01:19:22

标签: python matplotlib cluster-analysis k-means scatter-plot

我正在研究一种聚类算法,并且需要将我的散点图中属于同一聚类的所有点标记为相同的颜色。我有一个列表,它为每个点指示该点属于哪个簇,用整数0 ... k标记,其中k是簇的数量。我想知道如何将此列表映射到颜色(优选地,与预先已知的聚类算法中的聚类数量一样多的颜色)。我在python中使用matplotlib,我完全迷失了如何解决这个问题。

plt.scatter([item[0] for item in dataset],[item[1] for item in dataset],color='b')
plt.scatter([item[0] for item in centroids_list],[item[1] for item in centroids_list],color='r)

plt.show()

现在这就是我所拥有的,其中聚类点用蓝色表示,质心用红色表示。我想让质心保持红色,只改变数据集中点的颜色,使得同一簇的点具有相同的颜色。我迷失在matplotlib图书馆的海洋中,真的很感激任何帮助。

提前致谢!

2 个答案:

答案 0 :(得分:1)

请参阅pyplot.scatter documentation上的颜色参数。

基本上,您需要将数据分成簇,然后在循环中调用pyplot.scatter,每个都使用不同的项作为颜色参数。

您可以使用scipy.cluster中的vq使用您的质心将数据分配到群集,如下所示:

    assignments = vq( dataset, centroids_list )[0]
    clusters = [[] for i in range( len( assignments ) )
    for item, clustNum in zip( dataset, assignments ):
        clusters[clustNum].append( item )

至少这是我以前如果我正确记得的话。从那里它只是定义一个函数来返回一个随机颜色,然后:

    for cluster in clusters:
        plt.scatter([item[0] for item in cluster],[item[1] for item in cluster],color=randomColor() ) 

答案 1 :(得分:0)

如果您拥有numpy数组,则应该能够使用dataset[:,0]更有效地访问第一列。

我发现scatter有时表现得很奇怪(至少在ipython笔记本中),但plot函数也可以这样做。

i = 0
markers = matplotlib.lines.Line2D.markers.keys()
colors = list("bgrcmyk")
for cluster in clusters:
  marker, color = markers[i % len(markers)], colors[i % len(colors)]
  plt.plot(cluster[:,0],cluster[:,1],marker+color)
  i += 1