Подтвердить что ты не робот

Цвет Matplotlib в соответствии с метками класса

У меня есть два вектора: один со значениями и один с метками класса, такими как 1,2,3 и т.д.

Я хотел бы построить все точки, принадлежащие классу 1 красным цветом, до класса 2 в синем, до класса 3 зеленым и т.д. Как я могу это сделать?

4b9b3361

Ответ 1

Предполагая, что у вас есть данные в массиве 2d, это должно работать:

import numpy
import pylab
xy = numpy.zeros((2, 1000))
xy[0] = range(1000)
xy[1] = range(1000)
colors = [int(i % 23) for i in xy[0]]
pylab.scatter(xy[0], xy[1], c=colors)
pylab.show()

Вы также можете установить атрибут cmap для управления тем, какие цвета будут отображаться при использовании цветовой карты; то есть замените строку pylab.scatter на:

pylab.scatter(xy[0], xy[1], c=colors, cmap=pylab.cm.cool)

Список цветовых карт можно найти здесь

Ответ 2

В принятом ответе он отображается, но если вы захотите указать, какой ярлык класса следует назначить определенному цвету или ярлыку, вы можете сделать следующее. Я сделал небольшую гимнастику с цветовой гаммой, но сам сюжет сводится к хорошему однострочному. Это отлично подходит для построения результатов классификаций, выполненных с помощью sklearn. Каждая метка соответствует координате (x, y).

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

x = [4,8,12,16,1,4,9,16]
y = [1,4,9,16,4,8,12,3]
label = [0,1,2,3,0,1,2,3]
colors = ['red','green','blue','purple']

fig = plt.figure(figsize=(8,8))
plt.scatter(x, y, c=label, cmap=matplotlib.colors.ListedColormap(colors))

cb = plt.colorbar()
loc = np.arange(0,max(label),max(label)/float(len(colors)))
cb.set_ticks(loc)
cb.set_ticklabels(colors)

Цветовые метки цветных изображений

Используя слегка измененную версию ответа this, можно обобщить приведенное выше для N цветов следующим образом:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

N = 23 # Number of labels

# setup the plot
fig, ax = plt.subplots(1,1, figsize=(6,6))
# define the data
x = np.random.rand(1000)
y = np.random.rand(1000)
tag = np.random.randint(0,N,1000) # Tag each point with a corresponding label    

# define the colormap
cmap = plt.cm.jet
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# create the new map
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

# define the bins and normalize
bounds = np.linspace(0,N,N+1)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

# make the scatter
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,N),cmap=cmap,     norm=norm)
# create the colorbar
cb = plt.colorbar(scat, spacing='proportional',ticks=bounds)
cb.set_label('Custom cbar')
ax.set_title('Discrete color mappings')
plt.show()

Что дает:

введите описание изображения здесь

Ответ 3

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

arr1 = [1, 2, 3, 4, 5]
arr2 = [2, 3, 3, 4, 4]
labl = [0, 1, 1, 0, 0]
color= ['red' if l == 0 else 'green' for l in labl]
plt.scatter(arr1, arr2, color=color)