wake-up-neo.com

Wie zeichnet man eine Linie mit Matplotlib?

Ich kann keine Möglichkeit finden, eine beliebige Linie mit der matplotlib Python-Bibliothek zu zeichnen. Es erlaubt das Zeichnen von horizontalen und vertikalen Linien (z. B. mit matplotlib.pyplot.axhline und matplotlib.pyplot.axvline), aber ich sehe nicht, wie eine Linie durch zwei gegebene Punkte (x1, y1) und (x2, y2) gezeichnet wird. Gibt es einen Weg? Gibt es einen einfachen Weg?

20
Alexey

Ich habe geprüft, wie ax.axvline funktioniert, und ich habe eine kleine Funktion geschrieben, die einem Teil ihrer Idee ähnelt:

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

def newline(p1, p2):
    ax = plt.gca()
    xmin, xmax = ax.get_xbound()

    if(p2[0] == p1[0]):
        xmin = xmax = p1[0]
        ymin, ymax = ax.get_ybound()
    else:
        ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0])
        ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0])

    l = mlines.Line2D([xmin,xmax], [ymin,ymax])
    ax.add_line(l)
    return l

Wenn Sie den folgenden Code ausführen, werden Sie wissen, wie er funktioniert. Die Linie erstreckt sich über den gesamten Bereich Ihrer Zeichnung (unabhängig davon, wie groß sie ist), und die Erstellung der Linie erfordert keinen Datenpunkt innerhalb der Achse, sondern nur zwei feste Punkte, die Sie angeben müssen.

import numpy as np
x = np.linspace(0,10)
y = x**2

p1 = [1,20]
p2 = [6,70]

plt.plot(x, y)
newline(p1,p2)
plt.show()

 enter image description here

15
Alejandro

Dadurch wird eine Linie gezeichnet, die durch die Punkte (-1, 1) und (12, 4) verläuft, und eine weitere, die durch die Punkte (1, 3) und (10, 2) verläuft.

x1 sind die x-Koordinaten der Punkte für die erste Linie, y1 sind die y-Koordinaten für dieselbe - die Elemente in x1 und y1 müssen aufeinander folgen.

x2 und y2 sind für die andere Zeile gleich.

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 4]
x2, y2 = [1, 10], [3, 2]
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

Ich schlage vor, dass Sie einige der grundlegenden Tutorials auf der sehr umfangreichen Matplotlib-Website lesen und studieren, um sich mit der Bibliothek vertraut zu machen.

Was ist, wenn ich keine Liniensegmente will?

Es gibt keine direkte Möglichkeit, Linien auf unendlich zu verlängern ... matplotlib ändert entweder die Größe des Plots so, dass der am weitesten entfernte Punkt an der Grenze und der andere innen liegt, wodurch Liniensegmente in Kraft gesetzt werden. oder Sie müssen Punkte außerhalb der Begrenzung der Oberfläche auswählen, die Sie sichtbar setzen möchten, und Grenzwerte für die X- und Y-Achse festlegen.

Wie folgt:

import matplotlib.pyplot as plt
x1, y1 = [-1, 12], [1, 10]
x2, y2 = [-1, 10], [3, -1]
plt.xlim(0, 8), plt.ylim(-2, 8)
plt.plot(x1, y1, x2, y2, marker = 'o')
plt.show()

 enter image description here

30

Ich möchte hier nur eine andere Option erwähnen.

Sie können die Koeffizienten mithilfe von numpy.polyfit () berechnen und die Koeffizienten an numpy.poly1d () übergeben. Diese Funktion kann Polynome unter Verwendung der Koeffizienten konstruieren. Weitere Beispiele finden Sie hier

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.poly1d.html

Sagen wir, zwei Datenpunkte (-0.3, -0.5) und (0.8, 0.8)

import numpy as np
import matplotlib.pyplot as plt

# compute coefficients
coefficients = np.polyfit([-0.3, 0.8], [-0.5, 0.8], 1) 

# create a polynomial object with the coefficients
polynomial = np.poly1d(coefficients)

# for the line to extend beyond the two points, 
# create the linespace using the min and max of the x_lim
# I'm using -1 and 1 here
x_axis = np.linspace(-1, 1)

# compute the y for each x using the polynomial
y_axis = polynomial(x_axis)

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 1, 1])
axes.set_xlim(-1, 1)
axes.set_ylim(-1, 1)
axes.plot(x_axis, y_axis)
axes.plot(-0.3, -0.5, 0.8, 0.8, marker='o', color='red')

 enter image description here

Ich hoffe es hilft.

1
Ahaha