Более эффективный способ сопоставить цвета с легендой на графике рассеяния matplotlib? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь получить легенду для всех цветов кластера в модели гауссовой смеси. Набор данных довольно большой; Я могу нарисовать это очень быстро без правильной легенды (она дает только один цвет в легенде):

from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=9,random_state=15).fit(X)
clust_labels = gmm.predict(X)
plt.figure(figsize=(15,12))
plt.scatter(X.values[:, 0], X.values[:, 1], c=clust_labels, s=40, cmap='viridis')
plt.xlabel('Arrival Time')
plt.xticks(np.arange(0,24,2))
plt.ylabel('Session Duration in Hours')
plt.legend(clust_labels,loc=2)
plt.show()

... но если я попытаюсь включить все цвета в легенду, как обрисовано в общих чертах в некоторых других вопросах, для запуска цикла потребуется очень много времени. Вот мой код:

from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=9,random_state=15).fit(X)
clust_labels = gmm.predict(X)
plt.figure(figsize=(15,12))
cmap = plt.get_cmap('viridis')
names = np.unique(clust_labels).tolist()
colors = cmap(np.linspace(0, 1, len(names)))
for label in clust_labels:
    x = [X.values[i,0] for i in range(len(clust_labels)) if clust_labels[i]==label]
    y = [X.values[i,1] for i in range(len(clust_labels)) if clust_labels[i]==label]
    plt.scatter(x, y, color=colors[label], label=clust_labels[label])
plt.xlabel('Arrival Time')
plt.xticks(np.arange(0,24,2))
plt.ylabel('Session Duration in Hours')
plt.legend(loc=2)
plt.show()

Кажется, должен быть более простой способ сделать это без вечного цикла. Для меня было бы даже приемлемо иметь таблицу вне графика, отображающую цвета для кластеров; Мне просто нужен способ ссылки на кластеры для дальнейшей работы вне графика (т. Е. Работа только с данными из определенных кластеров).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...