webentwicklung-frage-antwort-db.com.de

Hinzufügen einer beliebigen Zeile zu einem matplotlib-Plot in ipython notebook

Ich bin ziemlich neu in Python/Matplotlib und benutze es über das Ipython-Notebook. Ich versuche, einem vorhandenen Diagramm einige Anmerkungslinien hinzuzufügen, und ich kann nicht herausfinden, wie die Linien in einem Diagramm gerendert werden. Wenn ich also zum Beispiel Folgendes zeichne:

import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p =  plot(x, y, "o")

Ich erhalte die folgende Grafik:

beautiful scatter plot

Wie füge ich eine vertikale Linie von (70.100) bis (70.250) hinzu? Was ist mit einer diagonalen Linie von (70.100) bis (90.200)?

Ich habe ein paar Dinge mit Line2D() ausprobiert, was zu nichts als Verwirrung meinerseits geführt hat. In R würde ich einfach die Funktion segment () verwenden, die Liniensegmente hinzufügt. Gibt es ein Äquivalent in matplotlib?

100
JD Long

Sie können die gewünschten Linien direkt zeichnen, indem Sie den Befehl plot mit den entsprechenden Daten (Grenzen der Segmente) eingeben:

plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)

(Natürlich können Sie die Farbe, Linienbreite, Linienart usw. wählen.)

Aus Ihrem Beispiel:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")


# draw vertical line from (70,100) to (70, 250)
plt.plot([70, 70], [100, 250], 'k-', lw=2)

# draw diagonal line from (70, 90) to (90, 200)
plt.plot([70, 90], [90, 200], 'k-')

plt.show()

new chart

162
gcalmettes

Für die Newcomer ist es noch nicht zu spät.

plt.axvline(x, color='r')

Es wird auch der Bereich von y verwendet, wobei ymin und ymax verwendet werden.

53
lifelogger

Mit vlines :

import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p =  plot(x, y, "o")
vlines(70,100,250)

Die grundlegenden Anrufsignaturen sind:

vlines(x, ymin, ymax)
hlines(y, xmin, xmax)
39

Matplolib erlaubt jetzt 'Anmerkungszeilen', wie es das OP suchte. Die Funktion annotate() ermöglicht verschiedene Formen von Verbindungspfaden, und ein Pfeil ohne Kopf und ohne Schwanz, d. H. Eine einfache Linie, ist eine davon.

ax.annotate("",
            xy=(0.2, 0.2), xycoords='data',
            xytext=(0.8, 0.8), textcoords='data',
            arrowprops=dict(arrowstyle="-",
                      connectionstyle="arc3, rad=0"),
            )

In der Dokumentation heißt es, dass Sie nur einen Pfeil mit einer leeren Zeichenfolge als erstes Argument zeichnen können.

Aus dem Beispiel des OP:

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(5)
x = np.arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
plt.plot(x, y, "o")


# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
              xy=(70, 100), xycoords='data',
              xytext=(70, 250), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              connectionstyle="arc3,rad=0."), 
              )

# draw diagonal line from (70, 90) to (90, 200)
plt.annotate("",
              xy=(70, 90), xycoords='data',
              xytext=(90, 200), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              connectionstyle="arc3,rad=0."), 
              )

plt.show()

Example inline image

Genau wie beim Ansatz in der Antwort von gcalmettes können Sie die Farbe, die Linienbreite, den Linienstil usw. auswählen.

Hier ist eine Änderung an einem Teil des Codes, durch die eine der beiden Beispielzeilen rot, breiter und nicht 100% undurchsichtig wird.

# draw vertical line from (70,100) to (70, 250)
plt.annotate("",
              xy=(70, 100), xycoords='data',
              xytext=(70, 250), textcoords='data',
              arrowprops=dict(arrowstyle="-",
                              edgecolor = "red",
                              linewidth=5,
                              alpha=0.65,
                              connectionstyle="arc3,rad=0."), 
              )

Sie können der Verbindungslinie auch eine Kurve hinzufügen, indem Sie connectionstyle anpassen.

5
Wayne