9 Stimmen

Matplotlib - Beschriftung von Punkten (x,y) auf einer Linie mit einem Wert z

Ich versuche, ein 2D-Diagramm mit Pyplot zu erstellen. Ich lese eine Datei mit mehreren Spalten ein, von denen jede etwa 100 Werte zwischen 1 und 10 enthält. Ich bin Plotten Spalte 5 gegen Spalte 6, die in Ordnung ist.

Außerdem möchte ich die resultierende Zeile mit ganzzahligen Werten aus Spalte 0 beschriften. Die Linie wird also 11 Punkte an den Positionen (x,y) haben, an denen die Spalte 0 eine ganze Zahl ist. Ich möchte auch, dass diese Punkte mit dieser ganzen Zahl beschriftet werden.

Ich wäre wirklich dankbar für jede Hilfe in dieser Sache, denn sie macht mich verrückt!

30voto

Joe Kington Punkte 258905

Aus Ihrer Frage geht hervor, dass mir nicht zu 100 % klar ist, was Sie genau tun wollen.

Möchten Sie nur jeden Scheitelpunkt einer Linie beschriften? Oder wollen Sie nur Scheitelpunkte beschriften, die ganze Zahlen sind? Oder wollen Sie interpolieren, wo ganzzahlige "Kreuzungen" entlang der Linie liegen und diese beschriften?

Um Ihre Textdatei zu laden, schauen Sie zunächst in numpy.loadtxt wenn Sie es nicht schon sind. In Ihrem speziellen Fall könnten Sie etwas tun wie:

z, x, y = np.loadtxt('data.txt', usecols=[0, 5, 6]).T

Auf jeden Fall ein kurzes Beispiel für die einfachste Option (Beschriftung jedes Scheitelpunkts):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = 2 * x
z = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y, 'bo-')

for X, Y, Z in zip(x, y, z):
    # Annotate the points 5 _points_ above and to the left of the vertex
    ax.annotate('{}'.format(Z), xy=(X,Y), xytext=(-5, 5), ha='right',
                textcoords='offset points')

plt.show()

enter image description here

Für die zweite Option könnten wir uns etwas ähnliches vorstellen (ähnlich dem Vorschlag von @mathematical.coffee):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-0.6, 5.6, 0.2)
y = 2 * x
z = x**2

fig, ax = plt.subplots()
ax.plot(x, y, 'bo-')

# Note the threshold... I'm assuming you want 1.000001 to be considered an int.
# Otherwise, you'd use "z % 1 == 0", but beware exact float comparisons!!
integers = z % 1 < 1e-6
for (X, Y, Z) in zip(x[integers], y[integers], z[integers]):
    ax.annotate('{:.0f}'.format(Z), xy=(X,Y), xytext=(-10, 10), ha='right',
                textcoords='offset points', 
                arrowprops=dict(arrowstyle='->', shrinkA=0))

plt.show()

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