繁体   English   中英

2D箭头图 - matplotlib和MATLAB输出不匹配

[英]2D quiver plot - matplotlib and MATLAB output doesnt match

我正在尝试创建一个matplotlib脚本,它将打印由MATLAB脚本生成的相当相同的箭头图。

对不起,我不能发布图片,因为我没有足够的特权,但基本上我的python脚本给了我完全不同的情节(完全错误的矢量方向)。

我在运行时比较了MATLAB和python之间的数据。 X,Y,Z相同,但梯度计算不正确,即python中的U与MATLAB中的DX 为什么会这样?

MATLAB

%2D quiver
[X,Y] = meshgrid(-2:.2:2);
Z = X.*exp(-X.^2 - Y.^2);
[DX,DY] = gradient(Z,.2,.2);
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
%colormap hsv
grid off
hold off

蟒蛇

from pylab import *
from numpy import ma
import numpy as np
import matplotlib.pyplot as plt

X,Y = np.meshgrid( np.linspace(-2,2,21),np.linspace(-2,2,21))
Z=X*np.exp(-X*X-Y*Y)

[U,V]=gradient(Z,.2,.2)

print U

figure()
Q = quiver(X,Y,U,V)
show()

简而言之:您正在使用numpy.gradient ,就好像它使用“column”,“row”索引一样。 当你期待dx, dy dy, dx它会返回dy, dx

首先除非你以交互方式使用它,否则from pylab import *做一个非常非常糟糕的主意 命名空间是你的朋友。

考虑到这一点,您当前的示例将如下所示:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(np.linspace(-2,2,21), np.linspace(-2,2,21))
z = x * np.exp(-x**2 - y**2)

u, v = np.gradient(z, .2, .2)

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

这会产生箭头指向错误方向的结果:

在此输入图像描述

如果我们交换周围的东西,我们将得到正确的结果:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.meshgrid(np.linspace(-2,2,21), np.linspace(-2,2,21))
z = x * np.exp(-x**2 - y**2)

v, u = np.gradient(z, .2, .2)

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

在此输入图像描述

您也可以考虑使用numpy.mgrid ,因为它更短且一致性。 对于2D情况, numpy.meshgrid默认交换东西(返回x,y而不是y,x),这使得它的行为与其他所有内容不一致。 np.meshgrid(..., indexing='ij')修复此问题,但默认行为有点令人困惑。)

举个例子:

import numpy as np
import matplotlib.pyplot as plt

y, x = np.mgrid[-2:2:21j, -2:2:21j]
z = x * np.exp(-x**2 - y**2)

v, u = np.gradient(z, .2, .2)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM