web-dev-qa-db-fra.com

Supprimer la ligne passant par le marqueur dans la légende matplotlib

J'ai un tracé matplotlib généré avec le code suivant:

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(Zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.plot(i+1, i+1, color=color,
            marker=mark,
            markerfacecolor='None',
            markeredgecolor=color,
            label=i)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend()

avec ceci comme figure générée: matplotlib generated figure

Je n'aime pas les lignes passant par les marqueurs de la légende. Comment puis-je m'en débarrasser?

27
jlconlin

Vous pouvez spécifier linestyle="None" comme argument de mot clé dans la commande plot:

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(Zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.plot(i+1, i+1, color=color,
            marker=mark,
            markerfacecolor='None',
            markeredgecolor=color,
            linestyle = 'None',
            label=`i`)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend(numpoints=1)
pyplot.show()

enter image description here

Comme vous ne tracez que des points uniques, vous ne pouvez pas voir l'attribut de ligne, sauf dans la légende.

40
tom10

Vous pouvez définir rcparams pour les tracés:

import matplotlib
matplotlib.rcParams['legend.handlelength'] = 0
matplotlib.rcParams['legend.numpoints'] = 1

enter image description here

Tous les paramètres de la légende. * Sont disponibles en tant que mots clés si vous ne souhaitez pas que le paramètre s'applique globalement à tous les tracés. Voir matplotlib.pyplot.legend documentation et cette question connexe:

le réglage de la légende (numpoints et points de dispersion) dans matplotlib ne fonctionne pas

7
Hooked

Pour supprimer simplement les lignes une fois les données tracées:

handles, labels = ax.get_legend_handles_labels()
for h in handles: h.set_linestyle("")
ax.legend(handles, labels)
4
blalterman

Vous devez utiliser un nuage de points ici

import matplotlib.pyplot as pyplot

Fig, ax = pyplot.subplots()
for i, (mark, color) in enumerate(Zip(
    ['s', 'o', 'D', 'v'], ['r', 'g', 'b', 'purple'])):
    ax.scatter(i+1, i+1, color=color,
            marker=mark,
            facecolors='none',
            label=i)

ax.set_xlim(0,5)
ax.set_ylim(0,5)
ax.legend(scatterpoints=1)

pyplot.show()
2
M4rtini