二维振动图matplotlib和MATLAB输出不匹配

2024-04-27 18:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

抱歉,我不能发布图片,因为我没有足够的权限,但基本上我的python脚本给我的绘图是完全不同的(完全错误的矢量方向)。在

我比较了MATLAB和python在运行时的数据。十、 Y,Z是相同的,但是没有正确计算梯度,python中的ieU与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

Python

^{pr2}$

Tags: 脚本权限绘图matplotlib矢量错误图片方向
1条回答
网友
1楼 · 发布于 2024-04-27 18:42:41

简而言之:您将numpy.gradient视为使用“column”、“row”索引。它返回dy, dx,而您期望的是dx, dy。在

首先,这是一个非常非常糟糕的主意,除非你是交互式地使用它。名称空间是你的朋友。在

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

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()

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

enter image description here

如果我们交换一下,就会得到正确的结果:

^{pr2}$

enter image description here

您还可以考虑使用numpy.mgrid,因为它比较短,而且为了一致性。numpy.meshgrid默认情况下,对于2D案例,它会交换一些东西(返回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()

相关问题 更多 >