解决 Python Quiverplots 问题

问题描述

我一直在尝试使用 matplotlib 库绘制矢量线图,但我一直得到这样的结果:

image

不确定发生了什么,因为我正在运行的代码似乎遵循了如何制作基本箭袋图的语法。我试过弄乱数组类型,看看这是否是问题,但没有运气。图中的某些点似乎没有获得任何矢量数据。

import matplotlib.pyplot as plt
import numpy as np


X = np.arange(-2,2,.1)
Y = np.arange(-2,.1)
x,y = np.meshgrid(X,Y)

m1 =1
m2 =2
x1 =4/3
x2 =2/3
omega = 3/8

u = -(m1/(abs(x-x1))**3)*(x-x1)-(m2/(abs(x-x2))**3)*(x-x2)+ x*omega
v = -(m1/(abs(y))**3)*(y)-(m2/(abs(y))**3)*(y)+ y*omega

fig,ax = plt.subplots()
ax.quiver(x,y,u,v)
plt.show()

解决方法

我发现查看数据的一个好方法是对矢量场进行归一化并按强度对其进行着色。您始终可以使用 Numpy MaskedArray 屏蔽强度过低的字形。往下看。

import matplotlib.colors as cl
import matplotlib.pyplot as plt
import matplotlib.ticker as tck
import numpy as np

x,y = np.meshgrid(np.linspace(-2,2,41),np.linspace(-2,41))

m1,m2,x1,x2,omega = (1,4 / 3,2 / 3,3 / 8)

u = -(m1 / abs(x - x1) ** 3 * (x - x1) - m2 / abs(x - x2) ** 3 * (x - x2)
      + x * omega)
v = y * (omega - (m1 + m2) / abs(y) ** 3)

fig,(ax,bx) = plt.subplots(ncols=2,figsize=(20,10))

ax.quiver(x,y,u,v,antialiased=True,scale=1e4,width=6e-3,headwidth=3,headlength=4,headaxislength=3.5,pivot='tail',edgecolors='xkcd:white',linewidths=1)
ax.set_aspect('equal')

w = np.sqrt(u ** 2 + v ** 2)
quiv = bx.quiver(x,u / w,v / w,w,scale=3e1,linewidths=1,norm=cl.LogNorm(vmin=1e-1,vmax=1e3))
bx.set_aspect('equal')
fig.colorbar(quiv,cax=fig.add_axes([0.93,0.1,0.02,0.8]),extend='both',ticks=tck.LogLocator(),format=tck.LogFormatterSciNotation())

enter image description here

,

某些 y 值接近于 0,因此您会得到非常大的 v 值。我会检查方程,因为该图实际上是正确的(当 y ~= 0 时箭头无限大)。