Python 2.7 如何在Matplotlib(Numpy)中生成MATLAB绘图(插值)?

Python 2.7 如何在Matplotlib(Numpy)中生成MATLAB绘图(插值)?,python-2.7,numpy,matplotlib,grid,mesh,Python 2.7,Numpy,Matplotlib,Grid,Mesh,我正试图遵循一个MATLAB的meshgrid+插值示例。找到了示例代码。在该站点上,我将介绍以下示例:示例–在曲面上显示非均匀数据 现在,我想用Python(Numpy+Matplotlib)生成一个类似于MATLAB中显示的图。这是MATLAB生成的曲线图: 我在Python中执行此操作时遇到问题。以下是我在Python 2.7中的代码和输出: from matplotlib.mlab import griddata import matplotlib.pyplot as plt from

我正试图遵循一个MATLAB的meshgrid+插值示例。找到了示例代码。在该站点上,我将介绍以下示例:示例–在曲面上显示非均匀数据

现在,我想用Python(Numpy+Matplotlib)生成一个类似于MATLAB中显示的图。这是MATLAB生成的曲线图:

我在Python中执行此操作时遇到问题。以下是我在Python 2.7中的代码和输出:

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = np.random.rand(200)*16 - 8
y = np.random.rand(200)*16 - 8
r = np.sqrt(x**2 + y**2)
z = np.sin(r)/r

xi = np.linspace(min(x),max(x), 100)
yi = np.linspace(min(y),max(y), 200)

X,Y = np.meshgrid(xi,yi)

Z = griddata(x, y, z, X, Y, interp='linear')

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap=cm.jet)
下面是我尝试使用matplotlib和NumPy执行此操作的结果


有人能帮我在matplotlib中重新创建MATLAB绘图,作为网格或曲面绘图吗?

因此,外观上的主要差异似乎与MATLAB绘制的默认行数有关,可以通过增加
rstride
cstride
进行调整。就颜色而言,为了正确缩放颜色贴图,在这种情况下最好设置您的限制,
vmin
vmax
,因为当自动设置时,它将使用Z的最小值和最大值,但在这种情况下,它们都是
nan
,因此您可以使用
np.nanmin
np.nanmax

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = np.random.rand(200)*16 - 8
y = np.random.rand(200)*16 - 8
r = np.sqrt(x**2 + y**2)
z = np.sin(r)/r

xi = np.linspace(min(x),max(x), 100)
yi = np.linspace(min(y),max(y), 200)

X,Y = np.meshgrid(xi,yi)

Z = griddata(x, y, z, X, Y, interp='linear')

fig = plt.figure()
ax = fig.gca(projection='3d')

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, vmin=np.nanmin(Z), vmax=np.nanmax(Z), shade=False)
scat = ax.scatter(x, y, z)
不幸的是,在matplotlib中,我遇到了一些恼人的重叠/剪裁问题,Axes3d并不总是正确地确定对象的显示顺序


我在运行代码时遇到此错误:
回溯(最近一次调用):文件“”,第1行,文件“C:\Python27\lib\site packages\matplotlib\mlab.py”,第2619行,griddata raise VALUERROR(“输出网格必须具有恒定间距”)ValueError:使用interp='linear'
pseudocubic时,输出网格必须具有恒定的间距:谢谢。似乎限制是我的主要问题。我有一些问题:a.我尝试了max(Z),我得到了以下结论:“ValueError:具有多个元素的数组的真值不明确。在尝试np.max(Z)时,请使用a.any()或a.all()我得到了与np.nanmax(Z)相同的答案。但是max(Z)没有为我返回NaN。你用什么代码看到max(Z)=NaN?b.在scipy的griddata()中这样做有好处吗?也就是说,你知道scipy提供的任何东西对这种插值更好吗?(a)存在的问题是,您正在
ndarray
上使用内置的
max
,您要使用的是
np.max(Z)
Z.max()
(b)scipy的griddata比matplotlib中包含的选项更多。我认为matplotlib应该更像matlab的实现,在这种情况下工作得很好。就个人而言,我总是使用scipy,但这可能只是习惯问题。谢谢。最后一个问题:我注意到您使用了“从matplotlib导入cm,颜色”。您在哪里使用了“颜色”?这是用于着色的吗?啊,对不起,最初我只是在玩
norm
,但最终不需要它。我现在已经从示例中删除了它。如果您想要颜色的日志缩放,例如,
norm=colors.LogNorm()
。嘿,谢谢。完整帖子中的所有问题都已回答。不幸的是,我似乎必须调查一下SciPy。