如何使用matplotlib在python中绘制向量

drnojrws  于 2024-01-05  发布在  Python
关注(0)|答案(8)|浏览(150)

我正在上线性代数的课程,我想把向量的作用形象化,比如向量加法,法向量,等等。
比如说:

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

字符串
在这个例子中,我想绘制3个向量V1 = (1,1), M2 = (-2,2), M3 = (4,-7)
然后我应该能够添加V1,V2来绘制一个新的矢量V12(全部在一个图中)。
当我使用下面的代码时,图不是预期的那样

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

vpfxa7rd

vpfxa7rd1#

比如说

import numpy as np
import matplotlib.pyplot as plt

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

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

字符串


的数据
然后将任意两个向量相加,并将它们绘制成相同的图形,在调用plt.show()之前这样做。类似于:

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], scale=21)
plt.show()



注意:在Python 2中使用origin[0], origin[1]而不是*origin

omhiaaxx

omhiaaxx2#

这也可以使用matplotlib.pyplot.quiver来实现,如链接的答案中所述;

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

字符串
x1c 0d1x的数据

erhoui1w

erhoui1w3#

你的主要问题是你在循环中创建了新的图形,所以每个矢量都画在不同的图形上。这是我的想法,如果它仍然不是你所期望的,请告诉我:
产品编号:

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

字符串
输出值:


的数据
编辑代码:

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


编辑输出:

e7arh2l6

e7arh2l64#

你希望下面的人做什么?

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

字符串
这是两个不同的元组,你覆盖了你第一次做的事情.无论如何,matplotlib不理解你使用的“向量”是什么。你必须明确,并绘制“箭头”:

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


测试结果:


的数据

ehxuflar

ehxuflar5#

感谢大家,你们的每个帖子都给了我很大的帮助。rbierman代码对于我的问题来说非常直接,我修改了一点,并创建了一个函数来绘制给定数组的向量。我很乐意看到任何进一步改进它的建议。

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

字符串
Vector addition performed on random vectors

aelbi1ox

aelbi1ox6#

所有好的解决方案,借用和即兴的特殊情况->如果你想添加一个标签附近的箭头:

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

字符串

kx7yvsdv

kx7yvsdv7#

为了使矢量长度和Angular 与绘图的x,y坐标相匹配,您可以使用以下选项来绘制图形:

plt.figure(figsize=(5,2), dpi=100)
plt.quiver(0,0,250,100, angles='xy', scale_units='xy', scale=1)
plt.xlim(0,250)
plt.ylim(0,100)

字符串

dxxyhpgq

dxxyhpgq8#

一旦你弄清楚它令人讨厌的细微差别,比如不以原始比例绘制矢量,Quiver是一个很好的方法。要做到这一点,我可以告诉你,你必须像许多人指出的那样将这些参数传递给Quiver call:angles='xy', scale_units='xy', scale=1你应该设置你的plt.xlimplt.ylim,这样你就得到了一个正方形或接近正方形的网格。这是唯一的方法,我已经得到了它一贯的绘图例如,将原点作为 *[0,0],将U,V作为 *[5,3],这意味着结果图应该是一个以0,0原点为中心的向量,在x轴上向右移动5个单位,在y轴上向上移动3个单位。

相关问题