J'ai créé un graphe de dispersion 4D pour représenter différentes températures dans une zone spécifique. Lorsque je crée la légende, celle-ci affiche le symbole et la couleur corrects, mais y ajoute une ligne. Le code que j'utilise est:
colors=['b', 'c', 'y', 'm', 'r']
lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0])
ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0])
l = plt.Line2D(range(10), range(10), marker='o',color=colors[1])
a = plt.Line2D(range(10), range(10), marker='o',color=colors[2])
h = plt.Line2D(range(10), range(10), marker='o',color=colors[3])
hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4])
ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4])
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8)
J'ai essayé de changer Line2D
En Scatter
et scatter
. Scatter
a renvoyé une erreur et scatter
a modifié le graphique et renvoyé une erreur.
Avec scatter
, j'ai changé le range(10)
en listes contenant les points de données. Chaque liste contient la variable x, y ou z.
lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0])
ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0])
l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1])
a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2])
h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3])
hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4])
ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, marker='x', color=colors[4])
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),scatterpoints=1, loc='lower left', ncol=3, fontsize=8)
Quand je lance ceci, la légende n'existe plus, c'est une petite boîte blanche dans le coin sans rien.
Aucun conseil?
Utiliser la méthode scatter
de la matplotlib.pyplot
Le module devrait fonctionner (au moins avec matplotlib 1.2.1 avec Python 2.7.5), comme dans l'exemple de code ci-dessous. De plus, si vous utilisez des diagrammes de dispersion, utilisez scatterpoints=1
plutôt que numpoints=1
dans l'appel de légende pour n'avoir qu'un seul point pour chaque entrée de légende.
Dans le code ci-dessous, j'ai utilisé des valeurs aléatoires plutôt que de tracer la même plage à plusieurs reprises, rendant tous les tracés visibles (c'est-à-dire ne se chevauchant pas).
import matplotlib.pyplot as plt
from numpy.random import random
colors = ['b', 'c', 'y', 'm', 'r']
lo = plt.scatter(random(10), random(10), marker='x', color=colors[0])
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0])
l = plt.scatter(random(10), random(10), marker='o', color=colors[1])
a = plt.scatter(random(10), random(10), marker='o', color=colors[2])
h = plt.scatter(random(10), random(10), marker='o', color=colors[3])
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4])
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4])
plt.legend((lo, ll, l, a, h, hh, ho),
('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),
scatterpoints=1,
loc='lower left',
ncol=3,
fontsize=8)
plt.show()
Pour tracer une dispersion en 3D, utilisez la méthode plot
, car la légende ne supporte pas Patch3DCollection
_ as est renvoyé par la méthode scatter
d'un Axes3D
exemple. Pour spécifier le marqueur de style, vous pouvez l'inclure en tant qu'argument de position dans l'appel de méthode, comme illustré dans l'exemple ci-dessous. On peut éventuellement inclure un argument pour les paramètres linestyle
et marker
.
import matplotlib.pyplot as plt
from numpy.random import random
from mpl_toolkits.mplot3d import Axes3D
colors=['b', 'c', 'y', 'm', 'r']
ax = plt.subplot(111, projection='3d')
ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier')
ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo')
ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo')
ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average')
ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi')
ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi')
ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier')
plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0))
plt.show()
Voici un moyen plus simple de le faire (source: here ):
import matplotlib.pyplot as plt
from numpy.random import Rand
fig, ax = plt.subplots()
for color in ['red', 'green', 'blue']:
n = 750
x, y = Rand(2, n)
scale = 200.0 * Rand(n)
ax.scatter(x, y, c=color, s=scale, label=color,
alpha=0.3, edgecolors='none')
ax.legend()
ax.grid(True)
plt.show()
Et vous aurez ceci:
Regardez ici pour les propriétés de légende
D'autres réponses semblent un peu complexes, vous pouvez simplement ajouter un paramètre 'label' dans la fonction scatter et ce sera la légende de votre tracé.
import matplotlib.pyplot as plt
from numpy.random import random
colors = ['b', 'c', 'y', 'm', 'r']
lo = plt.scatter(random(10), random(10), marker='x', color=colors[0],label='Low Outlier')
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0],label='LoLo')
l = plt.scatter(random(10), random(10), marker='o', color=colors[1],label='Lo')
a = plt.scatter(random(10), random(10), marker='o', color=colors[2],label='Average')
h = plt.scatter(random(10), random(10), marker='o', color=colors[3],label='Hi')
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4],label='HiHi')
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4],label='High Outlier')
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, ncol=4)
plt.show()