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.

J. Velazquez-Muriel
la source

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

unutbu
la source
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