使用matplotlib可视化3D列向量,代码生成的绘图结果是否正确?
问题描述
我正尝试使用matplotlib可视化两个3D列向量,对应向量如下:
v1 = (0, 2 , 1) v2 = (2, 2, 0)
参考书籍《Introduction to Linear Algebra, Fifth Edition (2016)》(作者Gilbert Strang)中给出的该向量可视化效果:
我自行编写的实现代码如下:
import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as plticker from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') soa = np.array([[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 4, 0.5, 0.7, 0]]) X, Y, Z, U, V, W = zip(*soa) ax.quiver(X, Y, Z, U, V, W) ax.set_xlim([-1, 5]) ax.set_ylim([-1, 5]) ax.set_zlim([-1, 8]) plt.show()
生成的实际绘图效果:
我不确定当前生成的可视化结果是否正确,若存在错误麻烦帮忙指正。
错误修正与解答
你当前的代码存在两处核心问题,输出结果不符合需求:
soa数组的定义完全错误:该数组每行的格式应为[向量起点x, 向量起点y, 向量起点z, 向量x分量, 向量y分量, 向量z分量],你当前的数组没有填入v1、v2的对应分量,反而填充了大量无效值和无关数值。- 3D模式下
quiver函数默认箭头比例失调,需要额外添加参数调整显示效果,同时保证向量长度和实际数值匹配。
修正后的可运行代码如下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 按格式填入两个从原点出发的向量参数 soa = np.array([ [0, 0, 0, 0, 2, 1], # 对应v1 [0, 0, 0, 2, 2, 0] # 对应v2 ]) X, Y, Z, U, V, W = zip(*soa) # 调整箭头比例、关闭自动归一化,添加区分颜色方便识别 ax.quiver(X, Y, Z, U, V, W, arrow_length_ratio=0.1, normalize=False, color=['red', 'blue']) # 调整坐标轴范围适配向量实际长度 ax.set_xlim([-1, 3]) ax.set_ylim([-1, 3]) ax.set_zlim([-1, 2]) # 添加坐标轴标注提升可读性 ax.set_xlabel('X轴') ax.set_ylabel('Y轴') ax.set_zlabel('Z轴') plt.show()
运行上述代码即可得到和参考教材一致的可视化效果,红色向量对应v1,蓝色向量对应v2。
内容的提问来源于stack exchange,提问作者Arijit Panda
相关产品推荐
相关产品推荐

