Как сделать точечный график для кластеризации в Python

Я выполняю кластеризацию и пытаюсь построить результат. Фиктивный набор данных:

данные

import numpy as np

X = np.random.randn(10)
Y = np.random.randn(10)
Cluster = np.array([0, 1, 1, 1, 3, 2, 2, 3, 0, 2])    # Labels of cluster 0 to 3

кластерный центр

 centers = np.random.randn(4, 2)    # 4 centers, each center is a 2D point

Вопрос

Я хочу сделать точечный график, чтобы показать точки в data и раскрасьте точки на основе меток кластера.

Тогда я хочу наложить center точки на том же графике рассеяния, в другой форме (например, "X") и пятом цвете (так как имеется 4 кластера).


Комментарий

  • Я перешел на seaborn 0.6.0, но не нашел API для выполнения этой задачи.
  • ggplot от yhat может сделать диаграмму рассеяния хорошей, но второй заменит первый.
  • Я запутался color а также cmap в matplotlib, поэтому мне интересно, смогу ли я использовать seaborn или ggplot для этого.

2 ответа

Решение

Первая часть вашего вопроса может быть выполнена с помощью colorbar и указав цвета, которые будут Cluster массив. Я смутно понял вторую часть вашего вопроса, но я верю, что это то, что вы ищете.

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(10)
y = np.random.randn(10)
Cluster = np.array([0, 1, 1, 1, 3, 2, 2, 3, 0, 2])    # Labels of cluster 0 to 3
centers = np.random.randn(4, 2) 

fig = plt.figure()
ax = fig.add_subplot(111)
scatter = ax.scatter(x,y,c=Cluster,s=50)
for i,j in centers:
    ax.scatter(i,j,s=50,c='red',marker='+')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.colorbar(scatter)

fig.show()

что приводит к:

где ваши "центры" были показаны с помощью + маркер. Вы можете указать любые цвета, которые хотите, чтобы они были такими же, как для x and y

Часть этого была дана ответ здесь. Схема

plt.scatter(x, y, c=color)

Цитирую документацию по matplotlib:

c: цвет или последовательность цветов, необязательно, по умолчанию [...] Обратите внимание, что c не должен быть единственной числовой последовательностью RGB или RGBA, поскольку она неотличима от массива значений, которые должны быть сопоставлены по цвету. c может быть двумерным массивом, в котором строки представляют собой RGB или RGBA.

Таким образом, в вашем случае вам нужен цвет для каждого кластера, а затем заполните массив цветов в соответствии с назначением кластера для каждой точки.

red = [1, 0, 0]
green = [0, 1, 0]
blue = [0, 0, 1]
colors = [red, red, green, blue, green]
Другие вопросы по тегам