Comment mettre des balises individuelles pour un nuage de points


214

J'essaie de faire un nuage de points dans matplotlib et je n'ai pas trouvé de moyen d'ajouter des balises aux points. Par exemple:

scatter1=plt.scatter(data1["x"], data1["y"], marker="o",
                     c="blue",
                     facecolors="white",
                     edgecolors="blue")

Je veux que les points en "y" aient des étiquettes comme "point 1", "point 2", etc. Je ne pouvais pas le comprendre.

Réponses:


374

Utilisez peut-être plt.annotate :

import numpy as np
import matplotlib.pyplot as plt

N = 10
data = np.random.random((N, 4))
labels = ['point{0}'.format(i) for i in range(N)]

plt.subplots_adjust(bottom = 0.1)
plt.scatter(
    data[:, 0], data[:, 1], marker='o', c=data[:, 2], s=data[:, 3] * 1500,
    cmap=plt.get_cmap('Spectral'))

for label, x, y in zip(labels, data[:, 0], data[:, 1]):
    plt.annotate(
        label,
        xy=(x, y), xytext=(-20, 20),
        textcoords='offset points', ha='right', va='bottom',
        bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
        arrowprops=dict(arrowstyle = '->', connectionstyle='arc3,rad=0'))

plt.show()

entrez la description de l'image ici


8
Voilà ce que j'allais dire. Lien vers les documents: matplotlib.sourceforge.net/api/… Lien vers la démo: matplotlib.sourceforge.net/examples/pylab_examples/…
Paul

4
@ubuntu Est-il possible d'utiliser des nombres (ou des étiquettes) à la place des points?
Vladtn

@Vladtn: Vous pouvez modifier les annotations en redéfinissant la labelsvariable.
unutbu

16
@Vladtn: Vous pouvez supprimer les cercles en omettant plt.scatter. Vous pouvez placer du texte arbitraire sur l'image à l'aide de plt.annotate(label, xy = (x, y), xytext = (0, 0), textcoords = 'offset points'). L'avis xytext = (0, 0)signifie qu'il n'y a pas de décalage et que l'omission arrowpropsfait en sorte plt.annotatede ne pas dessiner de flèche.
unutbu

1
@OParker: passez 'point{0}'.format(i)à 'point{0}'.format(i+1). Ou, vous pouvez changer le range: ['point{0}'.format(i) for i in range(N)]en ['point{0}'.format(i) for i in range(1,N+1)].
unutbu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.