web-dev-qa-db-fra.com

Matplotlib légende du nuage de points

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?

48
user2386081

Nuage de points 2D

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()

enter image description here

Nuage de points 3D

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()

enter image description here

100
sodd

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:

enter image description here

Regardez ici pour les propriétés de légende

2
Amir

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()

Voici votre sortie

0
Avelanche