如何在Matplotlib笛卡尔网格的2D向量上添加箭头并保留原有设置
解决Matplotlib绘制带箭头向量时丢失网格与轴设置的问题
完整修改代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.lines import Line2D # 定义向量矩阵 M = np.array([[1,5],[-2,2],[4,-5]]) # 创建画布和轴对象,直接指定尺寸,避免重复创建figure fig, ax = plt.subplots(figsize=(10, 10)) # 计算坐标轴范围,取所有向量分量绝对值的最大值+1,保证方形网格 max_val = np.amax(np.abs(M)) lim = max_val + 1 # 绘制带箭头的向量:使用ax.quiver,设置关键参数保证箭头正确显示 colors = ['blue', 'orange', 'green'] for i in range(M.shape[0]): ax.quiver(0, 0, M[i,0], M[i,1], angles='xy', scale_units='xy', scale=1, color=colors[i], linewidth=1.5) # 设置刻度:生成从-lim到lim的整数刻度 ticks = np.arange(-lim, lim+1) ax.set_xticks(ticks) ax.set_yticks(ticks) # 绘制原点、坐标轴 ax.plot(0, 0, 'ok') ax.axhline(0, linewidth=1, color='black') ax.axvline(0, linewidth=1, color='black') # 设置坐标轴范围,保证方形网格 ax.set_xlim([-lim, lim]) ax.set_ylim([-lim, lim]) # 设置图例:quiver的图例需手动创建Line2D对象模拟向量样式 legend_elements = [Line2D([0], [0], color=colors[i], lw=2, label=f'V{i+1}') for i in range(M.shape[0])] ax.legend(handles=legend_elements, loc='upper right') # 显示网格 ax.grid(which='both') plt.show()
关键修改说明
- 避免重复创建画布:你原代码先创建
fig, ax = plt.subplots(),又重新执行fig = plt.figure(figsize=(10,10)),导致之前的轴对象失效,所有设置被覆盖。直接在plt.subplots中指定figsize即可。 - 正确配置
quiver参数:angles='xy':确保箭头方向严格基于XY坐标系计算,不会出现方向变形scale_units='xy'+scale=1:让向量长度与坐标值完全对应,比如x分量为4的向量,在图上占4个单位长度
- 统一使用轴对象操作:用
ax.set_xticks、ax.set_xlim等方法替代plt.xxx,保证所有设置都作用在同一个轴上,不会出现设置丢失的情况 - 图例适配:
quiver无法直接通过label参数生成图例,需手动创建Line2D对象模拟向量样式,再添加到图例中
内容的提问来源于stack exchange,提问作者Mark Barry
相关产品推荐
相关产品推荐

