Cómo trazar vectores en python usando matplotlib

Estoy tomando un curso sobre álgebra lineal y quiero visualizar los vectores en acción, como la sum de vectores, vectores normales, etc.

Por ejemplo:

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

En este caso quiero trazar 3 vectores V1 = (1,1), M2 = (-2,2), M3 = (4,-7) .

Entonces debería poder agregar V1, V2 para trazar un nuevo vector V12 (todos juntos en una figura).

cuando utilizo el siguiente código, la ttwig no es la prevista

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

Que tal algo como

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

introduzca la descripción de la imagen aquí

Luego, para sumr dos vectores y plt.show() en la misma figura, hágalo antes de llamar a plt.show() . Algo como:

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

introduzca la descripción de la imagen aquí

NOTA: en Python2 use origin[0], origin[1] lugar de *origin

Esto también se puede lograr usando matplotlib.pyplot.quiver , como se indica en la respuesta vinculada;

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

salida mpl

¿Qué esperabas que hiciera lo siguiente?

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

Esto es hacer dos tuplas diferentes, y sobreescribe lo que hizo la primera vez … De todos modos, matplotlib no entiende qué es un “vector” en el sentido que está usando. Tienes que ser explícito, y trazar “flechas”:

 In [5]: ax = plt.axes() In [6]: ax.arrow(0, 0, *v1, head_width=0.05, head_length=0.1) Out[6]:  In [7]: ax.arrow(0, 0, *v2, head_width=0.05, head_length=0.1) Out[7]:  In [8]: plt.ylim(-5,5) Out[8]: (-5, 5) In [9]: plt.xlim(-5,5) Out[9]: (-5, 5) In [10]: plt.show() 

Resultado:

introduzca la descripción de la imagen aquí

El principal problema es que creas nuevas figuras en tu bucle, por lo que cada vector se dibuja en una figura diferente. Esto es lo que se me ocurrió, avíseme si todavía no es lo que usted espera:

CÓDIGO:

 import numpy as np import matplotlib.pyplot as plt M = np.array([[1,1],[-2,2],[4,-7]]) rows,cols = MTshape #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() 

SALIDA:

introduzca la descripción de la imagen aquí

CÓDIGO DE EDICIÓN:

 import numpy as np import matplotlib.pyplot as plt M = np.array([[1,1],[-2,2],[4,-7]]) rows,cols = MTshape #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() 

EDITAR SALIDA: introduzca la descripción de la imagen aquí

Gracias a todos, cada una de vuestras publicaciones me ha ayudado mucho. El código de rbierman fue bastante claro para mi pregunta, modifiqué un poco y creé una función para trazar vectores a partir de matrices dadas. Me encantaría ver alguna sugerencia para mejorarla aún más.

 import numpy as np import matplotlib.pyplot as plt def plotv(M): rows,cols = MTshape 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))) 

Suma de vectores realizada en vectores aleatorios.