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