Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: anonuser0428Ответов: 3

Я работаю над алгоритмом кластеризации, и мне нужно, чтобы все точки на моем графике рассеяния, принадлежащие одному кластеру, были помечены одним цветом. У меня есть список, который указывает для каждой точки, к какому кластеру принадлежит эта точка, отмеченный целым числом 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, и буду очень признателен за любую помощь.

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

pythonmatplotlibcluster-analysisk-meansscatter-plot

Ответы

Ответ 1 · рейтинг 1 · willy

См. Параметр цвета в документации по 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() )

Ответ 2 · рейтинг 1 · alexey

если вы используете массивы 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, чтобы добавить красочный фон, как, например, здесь

Ответ 3 · Has QUIT--Anony-Mousse

Если у вас есть 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы