Problème - Matrice 3D
Questions : Nov. 2012 , Oct. 2013
import numpy as np
a = np.random.random((2, 100, 4))
b = np.random.random((2, 100, 4))
c = np.random.random((2, 100, 4))
Solution - dictée de l'unicité
Dans mon cas _nolegend_
( bli y DSM ) ne fonctionnerait pas, pas plus que label if i==0
. ecatmur La réponse de l'entreprise utilise get_legend_handles_labels
et réduit la légende avec collections.OrderedDict
. Fons démontre que cela est possible sans importation.
En accord avec ces réponses, je suggère d'utiliser dict
pour des étiquettes uniques.
# Step-by-step
ax = plt.gca() # Get the axes you need
a = ax.get_legend_handles_labels() # a = [(h1 ... h2) (l1 ... l2)] non unique
b = {l:h for h,l in zip(*a)} # b = {l1:h1, l2:h2} unique
c = [*zip(*b.items())] # c = [(l1 l2) (h1 h2)]
d = c[::-1] # d = [(h1 h2) (l1 l2)]
plt.legend(*d)
Ou
plt.legend(*[*zip(*{l:h for h,l in zip(*ax.get_legend_handles_labels())}.items())][::-1])
Peut-être moins lisible et mémorable que Matthew Bourque La solution de l'entreprise. Code golf bienvenu.
Exemple
import numpy as np
a = np.random.random((2, 100, 4))
b = np.random.random((2, 100, 4))
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1)
ax.plot(*a, 'C0', label='a')
ax.plot(*b, 'C1', label='b')
ax.legend(*[*zip(*{l:h for h,l in zip(*ax.get_legend_handles_labels())}.items())][::-1])
# ax.legend() # Old, ^ New
plt.show()