web-dev-qa-db-fra.com

Comment tracer des vecteurs en python en utilisant matplotlib

Je suis un cours d'algèbre linéaire et je souhaite visualiser les vecteurs en action, tels que l'addition de vecteurs, le vecteur normal, etc. 

Par exemple: 

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

Dans ce cas, je veux tracer 3 vecteurs V1 = (1,1), M2 = (-2,2), M3 = (4,-7).

Ensuite, je devrais pouvoir ajouter V1, V2 pour tracer un nouveau vecteur V12 (tous ensemble dans une figure).

quand j'utilise le code suivant, l'intrigue n'est pas comme prévu

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()

Toute aide est grandement appréciée, merci d’avance. 

8
Shravan Kumar

Merci à tous, chacun de vos messages m'a beaucoup aidé. rbierman code était assez simple pour ma question, j'ai modifié un peu et créé une fonction pour tracer des vecteurs à partir de tableaux donnés J'aimerais voir des suggestions pour l'améliorer davantage. 

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)))

Addition de vecteurs effectuée sur des vecteurs aléatoires

2
Shravan Kumar

Que diriez-vous de quelque chose comme

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

Ensuite, pour additionner deux vecteurs et les tracer au même chiffre, faites-le avant d'appeler plt.show(). Quelque chose comme:

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

REMARQUE: dans Python2, utilisez Origin[0], Origin[1] au lieu de *Origin

13
Aziz Alto

Ceci peut également être réalisé en utilisant matplotlib.pyplot.quiver , comme indiqué dans la réponse liée;

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

Qu'attendiez-vous de ce qui suit?

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

Cela fait deux nuplets différents et vous écrasez ce que vous avez fait la première fois ... De toute façon, matplotlib ne comprend pas ce qu'est un "vecteur" dans le sens que vous utilisez. Vous devez être explicite et tracer des "flèches":

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()

Résultat:

 enter image description here

4
juanpa.arrivillaga

Votre problème principal est de créer de nouvelles figures dans votre boucle, de sorte que chaque vecteur soit tracé sur une figure différente. Voici ce que je suis venu avec, laissez-moi savoir si ce n'est toujours pas ce que vous attendez:

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()

SORTIE:

 enter image description here

MODIFIER LE 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)
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