Python 2.7 如何在Matplotlib(Numpy)中生成MATLAB绘图(插值)?
我正试图遵循一个MATLAB的meshgrid+插值示例。找到了示例代码。在该站点上,我将介绍以下示例:示例–在曲面上显示非均匀数据 现在,我想用Python(Numpy+Matplotlib)生成一个类似于MATLAB中显示的图。这是MATLAB生成的曲线图: 我在Python中执行此操作时遇到问题。以下是我在Python 2.7中的代码和输出: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
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。