如何在Matplotlib(Numpy)中产生MATLAB plot(interpolation)? [英] How to produce MATLAB plot (interpolation) in Matplotlib (Numpy)?

查看:214
本文介绍了如何在Matplotlib(Numpy)中产生MATLAB plot(interpolation)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试遵循MATLAB网格+插值示例.可以在 HERE .在该站点上,我将通过以下示例进行操作:示例–在曲面上显示非均匀数据.

I am trying to follow a MATLAB example of meshgrid + interpolation. The example code is found HERE. On that site, I am going through the following example: Example – Displaying Nonuniform Data on a Surface.

现在,我想在Python(Numpy + Matplotlib)中生成与MATLAB中所示相似的图.这是MATLAB生成的图:

Now, I would like to produce a similar plot in Python (Numpy + Matplotlib) to what is shown there in MATLAB. This is the plot that MATLAB produces:

我在Python中执行此操作时遇到了麻烦.这是我的代码和我在Python 2.7中的输出:

I am having trouble with doing this in Python. Here is my code and my output in 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进行操作的结果.

Here is the result of my attempt at doing this with matplotlib and NumPy..

有人可以帮我在matplotlib中以网格图或曲面图的形式重新创建MATLAB图吗?

Could someone please help me recreate the MATLAB plot in matplotlib, as either a mesh or a surface plot?

推荐答案

因此,外观上的主要差异似乎与matlab绘制的默认线数有关,可以通过增加rstridecstride.在颜色方面,为了正确缩放颜色图,在这种情况下最好设置极限值vminvmax,因为自动设置时,它将使用Z的最小值和最大值,但是在在这种情况下,它们都是nan,因此您可以使用np.nanminnp.nanmax.

So it seems that the major differences in the look have to do with the default number of lines plotted by matlab, which can be adjusted by increasing rstride and cstride. In terms of color, in order for the colormap to be scaled properly it is probably best in this case to set your limits, vmin and vmax because when automatically set, it will use the min and max of Z, but in this case, they are both nan, so you could use np.nanmin and 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并不总是正确地确定对象的显示顺序.

In matplotlib unfortunately I get some annoying overlapping/'clipping' problems, where Axes3d doesn't always properly determine the order in which object should be displayed.

这篇关于如何在Matplotlib(Numpy)中产生MATLAB plot(interpolation)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆