450 Stimmen

Streudiagramm mit unterschiedlichem Text bei jedem Datenpunkt

Ich versuche, ein Streudiagramm zu erstellen und Datenpunkte mit verschiedenen Zahlen aus einer Liste zu beschriften. Ich möchte also zum Beispiel Folgendes darstellen y vs x und vermerken Sie die entsprechenden Nummern aus 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')

Irgendwelche Ideen?

807voto

Rutger Kassies Punkte 60210

Ich kenne keine Plot-Methode, die Arrays oder Listen verwendet, aber Sie könnten Folgendes verwenden annotate() während der Iteration über die Werte in n .

import matplotlib.pyplot as plt
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 eine Vielzahl von Formatierungsmöglichkeiten für annotate() siehe die matplotlib-Website:

enter image description here

70voto

Heather Claxton Punkte 881

Für den Fall, dass jemand versucht, die oben genannten Lösungen auf eine .scatter() anstelle einer .subplot() ,

Ich habe versucht, den folgenden Code auszuführen

import matplotlib.pyplot as plt
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]))

Aber lief in Fehler, die "kann nicht entpacken nicht-iterable PathCollection-Objekt", mit dem Fehler speziell auf codeline fig, ax = plt.scatter(z, y) zeigen

Ich habe den Fehler schließlich mit folgendem Code gelöst

import matplotlib.pyplot as plt
plt.scatter(z, y)

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

Ich habe nicht erwartet, dass es einen Unterschied gibt zwischen .scatter() y .subplot() Ich hätte es besser wissen müssen.

46voto

rafaelvalle Punkte 6083

In Versionen früher als matplotlib 2.0, ax.scatter ist nicht notwendig, 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.

import matplotlib.pyplot as plt
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.

35voto

irudyak Punkte 1961

Sie können auch Folgendes verwenden pyplot.text (siehe aquí ).

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

22voto

Anwarvic Punkte 10911

Ich würde gerne noch hinzufügen, dass Sie sogar Pfeile/Textfelder verwenden können, um die Beschriftungen zu kommentieren. Hier ist, was ich meine:

import random
import matplotlib.pyplot as plt

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)

ax.annotate(n[0], (z[0], y[0]), xytext=(z[0]+0.05, y[0]+0.3), 
    arrowprops=dict(facecolor='red', shrink=0.05))

ax.annotate(n[1], (z[1], y[1]), xytext=(z[1]-0.05, y[1]-0.3), 
    arrowprops = dict(  arrowstyle="->",
                        connectionstyle="angle3,angleA=0,angleB=-90"))

ax.annotate(n[2], (z[2], y[2]), xytext=(z[2]-0.05, y[2]-0.3), 
    arrowprops = dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1))

ax.annotate(n[3], (z[3], y[3]), xytext=(z[3]+0.05, y[3]-0.2), 
    arrowprops = dict(arrowstyle="fancy"))

ax.annotate(n[4], (z[4], y[4]), xytext=(z[4]-0.1, y[4]-0.2),
    bbox=dict(boxstyle="round", alpha=0.1), 
    arrowprops = dict(arrowstyle="simple"))

plt.show()

Daraus ergibt sich das folgende Diagramm: enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X