web-dev-qa-db-fra.com

Définir manuellement la couleur des points dans la légende

Je fais un nuage de points qui ressemble à ceci:

enter image description here

(MWE au bas de la question)

Comme on peut le voir dans l'image ci-dessus, les couleurs des points de la légende sont automatiquement mises en bleu par matplotlib. Je dois définir ces points sur une autre couleur non présente dans la palette de couleurs (c'est-à-dire: noir) afin qu'ils ne génèrent pas de confusion avec les couleurs associées à ladite palette de couleurs.

J'ai regardé autour de moi mais le module matplotlib.legend ne semble pas accepter un mot clé color. Y a-t-il un moyen de faire ça?


Voici le 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()
25
Gabriel

Vous pouvez obtenir les poignées de légende et modifier leurs couleurs en procédant comme suit:

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

Vous pouvez récupérer l'étiquette de chaque poignée de légende avec lh.get_label() si vous souhaitez mapper des couleurs à des étiquettes spécifiques.

Pour mes besoins, il a été préférable de créer un dict à partir de LegendHandles et de changer les couleurs comme suit:

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')
1
apteryx