web-dev-qa-db-fra.com

Nuage de points matplotlib avec un texte différent à chaque point de données

J'essaie de faire un nuage de points et d'annoter des points de données avec des nombres différents d'une liste. Ainsi, par exemple, je veux tracer y vs x et annoter avec les nombres correspondants de n.

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
ax = fig.add_subplot(111)
ax1.scatter(z, y, fmt='o')

Des idées?

185
Labibah

Je ne connais aucune méthode de traçage qui prenne des tableaux ou des listes, mais vous pouvez utiliser annotate() en itérant les valeurs dans n.

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()
ax.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Il y a beaucoup d'options de formatage pour annotate(), voir le site web matplotlib:

enter image description here

358
Rutger Kassies

Dans les versions antérieures à matplotlib 2.0, ax.scatter n'est pas nécessaire pour tracer du texte sans marqueurs. Dans la version 2.0, vous aurez besoin de ax.scatter pour définir la plage et les marqueurs appropriés pour le texte.

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Et dans ce lien vous pouvez trouver un exemple en 3D.

27
rafaelvalle

Au cas où quelqu'un essaierait d'appliquer les solutions ci-dessus à un .scatter () au lieu d'un .subplot (),

J'ai essayé d'exécuter le code suivant

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Des erreurs sont toutefois survenues, indiquant que "ne peut pas décompresser un objet PathCollection non-itérable", l’erreur désignant spécifiquement la ligne de code fig, ax = plt.scatter (z, y).

J'ai finalement résolu l'erreur en utilisant le code suivant

plt.scatter(z, y)

for i, txt in enumerate(n):
    plt.annotate(txt, (z[i], y[i]))

Je ne m'attendais pas à ce qu'il y ait une différence entre .scatter () et .subplot () que j'aurais dû mieux connaître.

12
Heather Claxton

Vous pouvez également utiliser pyplot.text (voir ici ).

def plot_embeddings(M_reduced, Word2Ind, words):
""" Plot in a scatterplot the embeddings of the words specified in the list "words".
    Include a label next to each point.
"""
for Word in words:
    x, y = M_reduced[Word2Ind[Word]]
    plt.scatter(x, y, marker='x', color='red')
    plt.text(x+.03, y+.03, Word, fontsize=9)
plt.show()

M_reduced_plot_test = np.array([[1, 1], [-1, -1], [1, -1], [-1, 1], [0, 0]])
Word2Ind_plot_test = {'test1': 0, 'test2': 1, 'test3': 2, 'test4': 3, 'test5': 4}
words = ['test1', 'test2', 'test3', 'test4', 'test5']
plot_embeddings(M_reduced_plot_test, Word2Ind_plot_test, words)

enter image description here

5
irudyak