wake-up-neo.net

matplotlib-Streudiagramm mit unterschiedlichem Text an jedem Datenpunkt

Ich versuche, ein Streudiagramm zu erstellen und Datenpunkte mit unterschiedlichen Nummern aus einer Liste zu beschriften. so möchte ich zum Beispiel y gegen x zeichnen und mit entsprechenden Zahlen von n kommentieren.

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

Irgendwelche Ideen?

185
Labibah

Mir ist keine Zeichenmethode bekannt, die Arrays oder Listen verwendet, aber Sie können annotate() verwenden, während Sie die Werte in n durchlaufen.

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

Es gibt viele Formatierungsoptionen für annotate(), siehe matplotlib website:

enter image description here

358
Rutger Kassies

In früheren Versionen als matplotlib 2.0 ist ax.scatter ist nicht erforderlich, um Text ohne Markierungen zu zeichnen. In Version 2.0 benötigen Sie ax.scatter, um den richtigen Bereich und die richtigen Markierungen für den Text festzulegen.

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

Und in diesem Link finden Sie ein Beispiel in 3d.

27
rafaelvalle

Falls jemand versucht, die obigen Lösungen auf ein .scatter () anstelle eines .subplot () anzuwenden,

Ich habe versucht, den folgenden Code auszuführen

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

Es sind jedoch Fehler aufgetreten, die besagen, dass das nicht iterierbare PathCollection-Objekt nicht entpackt werden kann. Der Fehler zeigt speziell auf die Codeline fig, ax = plt.scatter (z, y).

Ich habe den Fehler schließlich mit dem folgenden Code behoben

plt.scatter(z, y)

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

Ich hätte nicht gedacht, dass es einen Unterschied zwischen .scatter () und .subplot () gibt, den ich besser kennen sollte.

12
Heather Claxton

Sie können auch pyplot.text (siehe hier ).

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