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

Matplotlib Quiver设置角度数组时方向绘制异常问题

关于Matplotlib Quiver绘制B矢量的方向问题

我正在x-z平面绘制B矢量。使用quiver(x,z,u,v,angles='xy')(其中u、v分别为bx、bz分量)绘图时,大部分图形可复现,但有小部分不匹配。此外,当我将通过arctan(bz/bx)计算得到的方向角度转为度数组作为angles参数时,无法得到正确结果。

import numpy as np 
import matplotlib.pyplot as plt

bx = [0.847718, 1.10198, 3.057813, 2.506806, 3.393603, 3.077797,
      2.146959, 0.819338, 0.927246, 0.744022]
bz = [5.795546, 6.50484, 4.179589, 4.434657, 4.450034, 4.771026,
      5.765941, 3.333912, 6.132857, 5.899621]
x_pos = [-4.0990367, -3.9878302, -3.8611758, -3.7163513, -3.55016, -3.3591635,
         -3.1397316, -2.8887184, -2.6041164, -2.2858455]
z_pos = [-1.7718704, -1.382828, -0.98846114, -0.5894755, -0.18716145, 0.21637209,
         0.61796373, 1.0132061, 1.3965136, 1.7616254]
b_angles1 = []
for i in range(len(bx)):
   b_angles1.append(np.arctan(bz[i] / bx[i]))
   b_deg_xz = np.degrees(b_angles1)

fig, axs = plt.subplots()
axs.quiver(x_pos, z_pos, bx, bz, angles='xy', color='red')
axs.quiver(x_pos, z_pos, bx, bz, angles=b_deg_xz, color='blue')
axs.set_ylim(-2, 2)
axs.set_xlim(1, -5)
plt.show()

绘图结果中蓝色箭头(使用角度数组)方向与预期不符,红色箭头(使用angles='xy')部分区域也存在匹配问题。


问题原因分析

  1. arctan的局限性:np.arctan(bz/bx)仅能返回-π/2到π/2之间的角度,无法处理全象限的方向判断;更关键的是,Matplotlib的quiver自定义angles参数要求角度是从x轴正方向逆时针旋转的角度,且需要配合scale_units和scale参数才能保证方向与长度的准确性。
  2. x轴反转的影响:你设置了axs.set_xlim(1, -5),将x轴方向反转(从右到左为x增大方向),但angles='xy'是基于原始轴方向计算角度,导致正bx的箭头在图中向左,与物理矢量的视觉预期不符。

解决方案

1. 正确计算方向角度

使用np.arctan2(bz, bx)替代arctan,它能根据bx和bz的正负判断象限,返回-π到π之间的正确角度,再转为度数:

b_angles_rad = np.arctan2(bz, bx)
b_deg_xz = np.degrees(b_angles_rad)

2. 处理x轴反转的方向匹配

若要保持x轴从右到左的显示,需将bx取反,让数据分量与图中轴方向对应:

bx_reversed = [-x for x in bx]

3. 自定义角度时的参数设置

传入自定义角度数组时,必须指定scale_units='xy'和scale=1,确保箭头的角度与长度严格匹配数据。

完整修正代码

import numpy as np 
import matplotlib.pyplot as plt

bx = [0.847718, 1.10198, 3.057813, 2.506806, 3.393603, 3.077797,
      2.146959, 0.819338, 0.927246, 0.744022]
bz = [5.795546, 6.50484, 4.179589, 4.434657, 4.450034, 4.771026,
      5.765941, 3.333912, 6.132857, 5.899621]
x_pos = [-4.0990367, -3.9878302, -3.8611758, -3.7163513, -3.55016, -3.3591635,
         -3.1397316, -2.8887184, -2.6041164, -2.2858455]
z_pos = [-1.7718704, -1.382828, -0.98846114, -0.5894755, -0.18716145, 0.21637209,
         0.61796373, 1.0132061, 1.3965136, 1.7616254]

# 正确计算全象限角度
b_angles_rad = np.arctan2(bz, bx)
b_deg_xz = np.degrees(b_angles_rad)

fig, axs = plt.subplots()

# 调整bx符号适配反转的x轴
bx_reversed = [-x for x in bx]
axs.quiver(x_pos, z_pos, bx_reversed, bz, angles='xy', color='red')
# 自定义角度时指定scale参数保证准确性
axs.quiver(x_pos, z_pos, bx_reversed, bz, angles=b_deg_xz, color='blue', scale_units='xy', scale=1)

axs.set_ylim(-2, 2)
axs.set_xlim(1, -5)
plt.show()

关键说明

  • np.arctan2(y, x)是计算矢量方向角的标准方式,完全匹配Matplotlibquiver的角度定义。
  • x轴反转时,数据分量的符号需要同步调整,否则视觉方向会与物理矢量方向相反。
  • 自定义角度必须配合scale_units='xy'和scale=1,才能让箭头的角度与长度严格对应数据值。

内容的提问来源于stack exchange,提问作者user21064805

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:16:00