2014-05-16 12 views
16

sto facendo un grafico a dispersione che assomiglia a questo:colore Impostare manualmente dei punti nella leggenda

enter image description here

(MWE in fondo alla questione)

Come si può vedere nell'immagine sopra i colori dei punti nella legenda sono impostati automaticamente su blu matplotlib. Ho bisogno di impostare questi punti su un altro colore non presente nella mappa dei colori (es: nero) in modo che non generino confusione con i colori associati a detta mappa di colori.

Mi sono guardato intorno ma il modulo matplotlib.legend non sembra accettare una parola chiave color. C'è un modo per fare questo?


Ecco il MWE:

import matplotlib.pyplot as plt 
import numpy as np 

def rand_data(): 
    return np.random.uniform(low=0., high=1., size=(100,)) 

# Generate data. 
x, y, x2, x3 = [rand_data() for i in range(4)] 
# This data defines the markes and labels used. 
x1 = np.random.random_integers(7, 9, size=(100,)) 

# Order all lists so smaller points are on top. 
order = np.argsort(-np.array(x2)) 
# Order x and y. 
x_o, y_o = np.take(x, order), np.take(y, order) 
# Order list related to markers and labels. 
z1 = np.take(x1, order) 
# Order list related to sizes. 
z2 = np.take(x2, order) 
# Order list related to colors. 
z3 = np.take(x3, order) 

plt.figure() 
cm = plt.cm.get_cmap('RdYlBu') 

# Scatter plot where each value in z1 has a different marker and label 
# assigned. 
mrk = {7: ('o', '7'), 8: ('s', '8'), 9: ('D', '9')} 
for key, value in mrk.items(): 

    s1 = (z1 == key) 
    plt.scatter(x_o[s1], y_o[s1], marker=value[0], label=value[1], 
     s=z2[s1] * 100., c=z3[s1], cmap=cm, lw=0.2) 

# Plot colorbar 
plt.colorbar() 

# Plot legend. 
plt.legend(loc="lower left", markerscale=0.7, scatterpoints=1, fontsize=10) 

plt.show() 

risposta

24

È possibile ottenere le maniglie leggenda e cambiare i loro colori facendo:

ax = plt.gca() 
leg = ax.get_legend() 
leg.legendHandles[0].set_color('red') 
leg.legendHandles[1].set_color('yellow') 
+1

Grazie, questo fa il trucco. – Gabriel

+1

Hai mai provato a farlo quando hai tracciato dei punti usando 'plt.plot' piuttosto che' plt.scatter'? Non funziona per me. Esecuzione di mpl v 2.0.0. – saintsfan342000

+0

@ saintsfan342000 Non ho provato in questo caso specifico. Ti risponderò presto –

1

È possibile recuperare l'etichetta di ogni maniglia leggenda con lh.get_label() se vuoi mappare i colori su etichette specifiche.

Per i miei scopi ha funzionato meglio per creare un dict da legendHandles e modificare i colori in questo modo:

ax = plt.gca() 
leg = ax.get_legend() 
hl_dict = {handle.get_label(): handle for handle in leg.legendHandles} 
hl_dict['9'].set_color('red') 
hl_dict['8'].set_color('yellow') 
Problemi correlati