Как связать метки с данными в цветовой шкале Matplotlib и на графике рассеяния - PullRequest
0 голосов
/ 03 февраля 2019

В настоящее время у меня есть 2d данные X и 1d вектор y цветовых кодов на строку в X.Я пытаюсь использовать функцию scatter в matplotlib, чтобы назначить цветовую кодовую точку в y каждому значению строки в X со следующим кодом, используя метку:

import matplotlib.pyplot as plt
import numpy as np
classes = 2
zones = (['FEF', 'IT'])

X = np.array([[-1.61160406,  0.06705226],
       [-2.34304523,  0.19353161],
       [-4.39162911, -0.15401544],
       [-1.9107751 ,  0.67541723],
       [-1.76792646,  0.71884401]])

y= np.array(['c', 'mediumpurple', 'mediumpurple', 'c', 'c'], dtype='<U12')


plt.scatter(X[:, 0], X[:, 1], color=y)
plt.colorbar(ticks=range(classes)).set_ticklabels(zones)
plt.show()

Iполучаю следующую ошибку:

TypeError: Сначала вы должны установить set_array для сопоставления

1 Ответ

0 голосов
/ 03 февраля 2019

Хорошо, проблема была не в plt.scatter, а в plt.colorbar.Это было не ясно из первоначального вопроса, потому что вы не включали вторую команду раньше.Потребовалось несколько комментариев, чтобы найти проблему.

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

  • Сначала найдите уникальные цвета в вашем цветовом массиве, используя np.unique.
  • Затем создайте пользовательскую карту цветов, используя ListedColormap из вашегоопределенные цвета.Это было вдохновлено решением, предоставленным здесь .Я проголосовал за это, как и вы.
  • Отображение строк (цветов) в целые числа.Я нашел, как это сделать из здесь .Я проголосовал за это, как и вы.
  • Последнее, но не по значению: используйте сопоставленные значения в качестве цветов с созданной пользователем картой цветов.


Вот полное решение:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

classes = 2
zones = (['FEF', 'IT'])

X = np.array([[-1.61160406,  0.06705226],
       [-2.34304523,  0.19353161],
       [-4.39162911, -0.15401544],
       [-1.9107751 ,  0.67541723],
       [-1.76792646,  0.71884401]])


y = np.array(['c', 'mediumpurple', 'mediumpurple', 'c', 'c'], dtype='<U12')
cmap = ListedColormap(np.unique(y))
# print (np.unique(y))
# ['c' 'mediumpurple']

# Mapping the colors to numbers
dics = {k: v for v, k in enumerate(sorted(set(y)))}
y_mapped = [dics[x] for x in y]
# print (y_mapped)
# [0, 1, 1, 0, 0]

plt.scatter(X[:, 0], X[:, 1], c=y_mapped, cmap=cmap)
plt.colorbar(ticks=range(classes)).set_ticklabels(zones)
plt.show()

enter image description here

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