Диаграмма рассеяния разделяет кластеры по цвету matplotlib python

Я работаю над алгоритмом кластеризации, и мне нужно, чтобы все точки на моем графике рассеяния, принадлежащие одному кластеру, были помечены одним цветом. У меня есть список, который указывает для каждой точки, к какому кластеру принадлежит эта точка, отмеченный целым числом 0 ... k, где k - количество кластеров. Я хотел бы знать, как сопоставить этот список с цветами (желательно столько цветов, сколько количество кластеров в алгоритме кластеризации, которое известно заранее). Я работаю с matplotlib в python и совершенно не понимаю, как решить эту проблему.

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, и буду очень признателен за любую помощь.

Заранее спасибо!


person anonuser0428    schedule 08.11.2013    source источник


Ответы (3)


См. Параметр цвета в документации по pyplot.scatter.

По сути, вам нужно разделить данные на кластеры, а затем вызвать pyplot.scatter в цикле, каждый с другим элементом в качестве параметра цвета.

Вы можете использовать vq из scipy.cluster для назначения ваших данных кластерам с использованием ваших центроидов, например:

    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() ) 
person willy    schedule 08.11.2013
comment
Если у вас много кластеров, вы также можете изучить использование параметра маркера, чтобы упростить различение. - person willy; 08.11.2013

если вы используете массивы numpy, вы можете упростить нарезку, и если вы перейдете к метке кластеров color param, она должна работать нормально:

plt.scatter(item[:, 0], item[:, 1], color=clusters)
plt.scatter(centroids_list[:, 0], centroids_list[:, 1], s=70, c='r')

и вы можете использовать meshgrid вместе с plt.imshow, чтобы добавить красочный фон, как, например, здесь

person alexey    schedule 18.12.2015

Если у вас есть 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
person Has QUIT--Anony-Mousse    schedule 08.11.2013