2015-06-05 3 views
1

Я работаю с довольно простым примером. Я создаю три диаграммы рассеяния на одном и том же наборе осей, и каждый набор данных, который у меня есть, имеет другую связанную цветокоррекцию. Однако легенда не выглядит так, как мне хотелось бы; почему это?Python Scatter Plot with Colorbar and Legend Issues

import numpy as np 
import matplotlib.pyplot as plt 
t = np.linspace(0,10,100) 
x = np.random.rand(100,3) 
y = np.random.rand(100,3) 

colmaps = ['Blues', 'Greys', 'Reds'] 
for i in range(3): 
    plt.scatter(x[:,i], y[:,i], c=t, cmap=colmaps[i], label=i) 

plt.legend() 
plt.show() 

Это создает фигуру, как показано ниже: Legend entries are all blue

Я надеялся на первый ярлык быть синим, второй быть серым, а третий будет красным, так что они связаны с colormap, но похоже, что это не так, как это работает. Есть ли простой способ сделать это?

Благодаря

+0

Какой цвет на 3 точки в легенде есть, если вы установите в 'палитру jet'? – hitzg

+0

Я пробовал сделать цветовой код для второго набора точек разброса точек, и легенда остается неизменной. Похоже, у кого-то внизу есть ответ! – Chimi

ответ

3

Вы можете установить легенды цвета, как, например:

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0,10,100) 
x = np.random.rand(100,3) 
y = np.random.rand(100,3) 
colmaps = ['Blues', 'Greys', 'Reds'] 

for i in range(3): 
    plt.scatter(x[:,i], y[:,i], c=t, cmap=colmaps[i], label=i) 

plt.legend() 
ax = plt.gca() 
legend = ax.get_legend() 
legend.legendHandles[0].set_color(plt.cm.Blues(.8)) 
legend.legendHandles[1].set_color(plt.cm.Greys(.8)) 
legend.legendHandles[2].set_color(plt.cm.Reds(.8)) 
plt.show() 

я установить цвет каждого legendHandle к определенному значению в соответствующая цветовая палитра.

enter image description here

Если вы сделаете размер Разброс ползунков больше вы можете увидеть цвет и ассоциировать отдельные точки с легендой проще. Я также задал только одну точку на участке рассеяния в легенде, а не по умолчанию 3, и установил альфа легенды в 0.5, а альфа-диаграммы рассеяния - 0,7.

... 
for i in range(3): 
    plt.scatter(x[:,i], y[:,i], c=t, cmap=colmaps[i], label=i, s=200, alpha=0.7) 
plt.legend(markerscale=0.7, scatterpoints=1) 
ax = plt.gca() 
legend = ax.get_legend() 
legend.legendHandles[0].set_color(plt.cm.Blues(.8)) 
legend.legendHandles[1].set_color(plt.cm.Greys(.8)) 
legend.legendHandles[2].set_color(plt.cm.Reds(.8)) 
legend.get_frame().set_alpha(0.5) 
... 

enter image description here

+1

Отлично, спасибо! Я новичок в Python, поэтому мне не так удобно манипулировать легендами. Это именно то, что я искал. – Chimi

+0

@Chimi Счастливые это сработало для вас. – Scott

-1

Я не совсем понимаю, почему вы делаете c=t ... но это то, что вы хотели?

enter image description here

Вот код:

1 import numpy as np 
    2 import matplotlib.pyplot as plt 
    3      
    4 colors = ['b', 'c', 'r'] 
    5 markers = ['x', 'o', '^'] 
    6 scatters = []  
    7      
    8 x = np.random.rand(100,3) 
    9 y = np.random.rand(100,3) 
10      
11 for i in range(3): 
12  scatters.append(plt.scatter(x[:,i], y[:,i], color=colors[i], marker=markers[i], label=i)) 
13      
14 plt.legend((scatters[0], scatters[1], scatters[2]), 
15    ('scatter 1', 'scatter 2', 'scatter 3'), 
16    scatterpoints=1, 
17    loc='upper right', 
18    ncol=3,                         
19    fontsize=8) 
20 plt.show() 
+0

Привет, c = t, так что цвет каждой точки изменяется в соответствии с переменной t по указанной цветовой палитре. – Chimi