Сначала, чтобы установить цвета в соответствии со значениями в y
, вы можете сделать это:
color = ['red' if i==0 else 'green' for i in y]
plt.scatter(X[:,0], X[:,1], c=color)
Теперь говорим о scatter()
и cmap
.
ColorMaps используются для предоставления цветов из значений с плавающей точкой. См. эту документацию для справки по цветным картам .

Для значений от 0 до 1 цвет выбирается из этих цветовых карт.
Например:
plt.cm.Spectral(0.0)
# (0.6196078431372549, 0.00392156862745098, 0.25882352941176473, 1.0) #<== magenta
plt.cm.Spectral(1.0)
# (0.3686274509803922, 0.30980392156862746, 0.6352941176470588, 1.0) #<== blue
plt.cm.Spectral(1)
# (0.6280661284121491, 0.013302575932333718, 0.26082276047673975, 1.0)
Обратите внимание, что результаты 1.0 и 1 отличаются в приведенном выше коде, поскольку int и float обрабатываются по-разному, как указано в документации __call__()
здесь :
Для значений с плавающей запятой X должен быть в интервале [0.0, 1.0]
, чтобы вернуть
Значения RGBA X*100
процентов по линии Colormap.
Для целых чисел X должен быть в интервале [0, Colormap.N)
до
вернуть значения RGBA , индексированные из Colormap с индексом X
.
Пожалуйста, посмотрите на этот ответ для более подробного объяснения цветовых карт: -
В вашем y у вас есть 0 и 1, поэтому используются значения RGBA, показанные в приведенном выше коде (которые представляют два конца цветовой карты Spectral).
Теперь вот как c
и cmap
параметры в plt.scatter()
взаимодействуют друг с другом.
_______________________________________________________________________
|No | type of x, y | c type | values in c | result |
|___|______________|__________|_____________|___________________________|
|1 | single | scalar | numbers | cmap(0.0), no matter |
| | point | | | what the value in c |
|___|______________|__________|_____________|___________________________|
|2 | array of | array | numbers | normalize the values in c,|
| | points | | | cmap(normalized val in c) |
|___|______________|__________|_____________|___________________________|
|3 | scalar or | scalar or| RGBA Values,| no use of cmap, |
| | array | array |Color Strings| use colors from c |
|___|______________|__________|_____________|___________________________|
Теперь, как только фактические цвета будут определены, циклически перебирайте цвета для каждой точки в x, y
. Если размер x, y равен или меньше размера цветов в c, тогда вы получите идеальное отображение, иначе цвета более старых используются снова.
Вот пример, иллюстрирующий это:
# Case 1 from above table
# All three points get the same color = plt.cm.Spectral(0)
plt.scatter(x=0.0, y=0.2, c=0, cmap=plt.cm.Spectral)
plt.scatter(x=0.0, y=0.3, c=1, cmap=plt.cm.Spectral)
plt.scatter(x=0.0, y=0.4, c=1.0, cmap=plt.cm.Spectral)
# Case 2 from above table
# The values in c are normalized
# highest value in c gets plt.cm.Spectral(1.0)
# lowest value in c gets plt.cm.Spectral(0.0)
# Others in between as per normalizing
# Size of arrays in x, y, and c must match here, else error is thrown
plt.scatter([0.1, 0.1, 0.1, 0.1, 0.1], [0.2, 0.3, 0.4, 0.5, 0.6],
c=[1, 2, 3, 4, 5], cmap=plt.cm.Spectral)
# Case 3 from above table => No use of cmap here,
# blue is assigned to the point
plt.scatter(x=0.2, y=0.3, c='b')
# You can also provide rgba tuple
plt.scatter(x=0.2, y=0.4, c=plt.cm.Spectral(0.0))
# Since a single point is present, the first color (green) is given
plt.scatter(x=0.2, y=0.5, c=['g', 'r'])
# Same color 'cyan' is assigned to all values
plt.scatter([0.3, 0.3, 0.3, 0.3, 0.3], [0.2, 0.3, 0.4, 0.5, 0.6],
c='c')
# Colors are cycled through points
# 4th point will get again first color
plt.scatter([0.4, 0.4, 0.4, 0.4, 0.4], [0.2, 0.3, 0.4, 0.5, 0.6],
c=['m', 'y', 'k'])
# Same way for rgba values
# Third point will get first color again
plt.scatter([0.5, 0.5, 0.5, 0.5, 0.5], [0.2, 0.3, 0.4, 0.5, 0.6],
c=[plt.cm.Spectral(0.0), plt.cm.Spectral(1.0)])
Выход:

Просмотрите комментарии в коде и расположении точек вместе с цветами, чтобы понять полностью.
Вы также можете заменить параметр c
на color
в коде варианта 3, и результаты останутся такими же.