it-swarm.com.de

Vektoren in Python mit Matplotlib plotten

Ich mache einen Kurs über lineare Algebra und möchte die Vektoren in Aktion visualisieren, z. B. Vektoraddition, Normalvektor usw. 

Zum Beispiel: 

V = np.array([[1,1],[-2,2],[4,-7]])

In diesem Fall möchte ich 3 Vektoren V1 = (1,1), M2 = (-2,2), M3 = (4,-7) zeichnen.

Dann sollte ich in der Lage sein, V1, V2 hinzuzufügen, um einen neuen Vektor V12 (alle in einer Figur) zu zeichnen.

wenn ich den folgenden Code verwende, ist die Darstellung nicht wie beabsichtigt

import numpy as np
import matplotlib.pyplot as plt
M = np.array([[1,1],[-2,2],[4,-7]])

print("vector:1")
print(M[0,:])
# print("vector:2")
# print(M[1,:])
rows,cols = M.T.shape
print(cols)

for i,l in enumerate(range(0,cols)):
    print("Iteration: {}-{}".format(i,l))
    print("vector:{}".format(i))
    print(M[i,:])
    v1 = [0,0],[M[i,0],M[i,1]]
    # v1 = [M[i,0]],[M[i,1]]
    print(v1)
    plt.figure(i)
    plt.plot(v1)
    plt.show()

Jede Hilfe wird sehr geschätzt, vielen Dank im Voraus. 

8
Shravan Kumar

Vielen Dank an alle, jeder Ihrer Beiträge hat mir sehr geholfen. rbierman code war für meine Frage ziemlich direkt, ich habe ein wenig geändert und eine Funktion erstellt, um Vektoren aus gegebenen Arrays zu zeichnen. Ich würde gerne Vorschläge sehen, um es weiter zu verbessern. 

import numpy as np
import matplotlib.pyplot as plt
def plotv(M):
    rows,cols = M.T.shape
    print(rows,cols)

    #Get absolute maxes for axis ranges to center Origin
    #This is optional
    maxes = 1.1*np.amax(abs(M), axis = 0)
    colors = ['b','r','k']
    fig = plt.figure()
    fig.suptitle('Vectors', fontsize=10, fontweight='bold')

    ax = fig.add_subplot(111)
    fig.subplots_adjust(top=0.85)
    ax.set_title('Vector operations')

    ax.set_xlabel('x')
    ax.set_ylabel('y')

    for i,l in enumerate(range(0,cols)):
        # print(i)
        plt.axes().arrow(0,0,M[i,0],M[i,1],head_width=0.2,head_length=0.1,zorder=3)

        ax.text(M[i,0],M[i,1], str(M[i]), style='italic',
            bbox={'facecolor':'red', 'alpha':0.5, 'pad':0.5})

    plt.plot(0,0,'ok') #<-- plot a black point at the Origin
    # plt.axis('equal')  #<-- set the axes to the same scale
    plt.xlim([-maxes[0],maxes[0]]) #<-- set the x axis limits
    plt.ylim([-maxes[1],maxes[1]]) #<-- set the y axis limits

    plt.grid(b=True, which='major') #<-- plot grid lines
    plt.show()

r = np.random.randint(4,size=[2,2])
print(r[0,:])
print(r[1,:])
r12 = np.add(r[0,:],r[1,:])
print(r12)
plotv(np.vstack((r,r12)))

Vektoraddition mit zufälligen Vektoren

2
Shravan Kumar

Wie wäre es mit so etwas

import numpy as np
import matplotlib.pyplot as plt

V = np.array([[1,1],[-2,2],[4,-7]])
Origin = [0], [0] # Origin point

plt.quiver(*Origin, V[:,0], V[:,1], color=['r','b','g'], scale=21)
plt.show()

 enter image description here

Um dann zwei Vektoren zusammenzurechnen und in dieselbe Figur zu zeichnen, tun Sie dies, bevor Sie plt.show() aufrufen. So etwas wie:

plt.quiver(*Origin, V[:,0], V[:,1], color=['r','b','g'], scale=21)
v12 = V[0] + V[1] # adding up the 1st (red) and 2nd (blue) vectors
plt.quiver(*Origin, v12[0], v12[1])
plt.show()

 enter image description here

HINWEIS: Verwenden Sie in Python2 Origin[0], Origin[1] anstelle von *Origin.

13
Aziz Alto

Dies kann auch mit matplotlib.pyplot.quiver erreicht werden, wie in der verknüpften Antwort angegeben;

plt.quiver([0, 0, 0], [0, 0, 0], [1, -2, 4], [1, 2, -7], angles='xy', scale_units='xy', scale=1)
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.show()

 mpl output

8
fuglede

Was haben Sie erwartet?

v1 = [0,0],[M[i,0],M[i,1]]
v1 = [M[i,0]],[M[i,1]]

Dies macht zwei verschiedene Tupel, und Sie überschreiben das, was Sie beim ersten Mal gemacht haben ... Wie auch immer, matplotlib versteht nicht, was ein "Vektor" in dem von Ihnen verwendeten Sinn ist. Sie müssen explizit sein und "Pfeile" zeichnen:

In [5]: ax = plt.axes()

In [6]: ax.arrow(0, 0, *v1, head_width=0.05, head_length=0.1)
Out[6]: <matplotlib.patches.FancyArrow at 0x114fc8358>

In [7]: ax.arrow(0, 0, *v2, head_width=0.05, head_length=0.1)
Out[7]: <matplotlib.patches.FancyArrow at 0x115bb1470>

In [8]: plt.ylim(-5,5)
Out[8]: (-5, 5)

In [9]: plt.xlim(-5,5)
Out[9]: (-5, 5)

In [10]: plt.show()

Ergebnis:

 enter image description here

4

Ihr Hauptproblem besteht darin, dass Sie in Ihrer Schleife neue Figuren erstellen, sodass jeder Vektor auf eine andere Figur gezeichnet wird. Hier ist was ich erfunden habe, lass es mich wissen wenn es immer noch nicht das ist was du erwartest:

CODE:

import numpy as np
import matplotlib.pyplot as plt
M = np.array([[1,1],[-2,2],[4,-7]])

rows,cols = M.T.shape

#Get absolute maxes for axis ranges to center Origin
#This is optional
maxes = 1.1*np.amax(abs(M), axis = 0)

for i,l in enumerate(range(0,cols)):
    xs = [0,M[i,0]]
    ys = [0,M[i,1]]
    plt.plot(xs,ys)

plt.plot(0,0,'ok') #<-- plot a black point at the Origin
plt.axis('equal')  #<-- set the axes to the same scale
plt.xlim([-maxes[0],maxes[0]]) #<-- set the x axis limits
plt.ylim([-maxes[1],maxes[1]]) #<-- set the y axis limits
plt.legend(['V'+str(i+1) for i in range(cols)]) #<-- give a legend
plt.grid(b=True, which='major') #<-- plot grid lines
plt.show()

AUSGABE:

 enter image description here

CODE BEARBEITEN:

import numpy as np
import matplotlib.pyplot as plt
M = np.array([[1,1],[-2,2],[4,-7]])

rows,cols = M.T.shape

#Get absolute maxes for axis ranges to center Origin
#This is optional
maxes = 1.1*np.amax(abs(M), axis = 0)
colors = ['b','r','k']


for i,l in enumerate(range(0,cols)):
    plt.axes().arrow(0,0,M[i,0],M[i,1],head_width=0.05,head_length=0.1,color = colors[i])

plt.plot(0,0,'ok') #<-- plot a black point at the Origin
plt.axis('equal')  #<-- set the axes to the same scale
plt.xlim([-maxes[0],maxes[0]]) #<-- set the x axis limits
plt.ylim([-maxes[1],maxes[1]]) #<-- set the y axis limits
plt.grid(b=True, which='major') #<-- plot grid lines
plt.show()

EDIT OUTPUT:  enter image description here

3
mitoRibo

Alle Nice-Lösungen, Ausleihen und Improvisieren für Sonderfälle -> Wenn Sie eine Beschriftung in der Nähe der Pfeilspitze hinzufügen möchten:


    arr = [2,3]
    txt = “Vector X”
    ax.annotate(txt, arr)
    ax.arrow(0, 0, *arr, head_width=0.05, head_length=0.1)

0
muon