2015-06-23 4 views
0

Предположим, у меня есть массив X (X.shape = [N, 2]) и метки (labels.shape = N). Я хочу создать разброс X [:, 0], X [:, 1], цвет, соответствующий метке, и отображать только уникальные ярлыки.Matplotlib: отображение только уникальных меток для легенды

Код:

import numpy as np 
from numpy.random import rand 

import matplotlib 
from matplotlib import pyplot as plt 
%matplotlib inline 

import seaborn as sns 
sns.set(context='poster', style='dark') 

X = rand(500) 
Y = rand(500) 
labels = np.round(rand(500)*4).astype(int) 
print(np.unique(labels)) # array([0, 1, 2, 3, 4]) 

plt.scatter(X, Y, c=labels, cmap='rainbow') # this does what I want minus the labels 

plt.scatter(X, Y, c=labels, cmap='rainbow', label=labels) 
plt.legend(loc='best') # this produces 500 labels instead of 5 

ответ

0

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

import numpy as np 
from numpy.random import rand 

import matplotlib.pyplot as plt 
from matplotlib import cm, colors 
%matplotlib inline 

import seaborn as sns 
sns.set(context='poster', style='dark') 

X = rand(500) 
Y = rand(500) 
labels = np.round(rand(500)*4).astype(int) 
unique_labels=np.unique(labels) # array([0, 1, 2, 3, 4]) 

norm = colors.Normalize(vmin=unique_labels[0], vmax=unique_labels[-1]) 
m = cm.ScalarMappable(norm=norm, cmap=cm.rainbow) 

for label in np.unique(labels): 
    color = m.to_rgba(label) 
    plt.scatter(X[labels==label], Y[labels==label], c=color, label=label) 

plt.legend(loc='best') 

производит это (без seaborn, так как я не имею, что установлен, но вы получите идею): enter image description here

Смежные вопросы