You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:35:55