微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Scipy 对 2D 表面进行插值以进行 Matplotlib 渲染?

如何解决如何使用 Scipy 对 2D 表面进行插值以进行 Matplotlib 渲染?

给定一个使用 Matplotlib 显示的带有少量点的 2D 表面:

Matplotlib 3D surface

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

fig,ax = plt.subplots(subplot_kw={"projection": "3d"})

x = np.arange(0,4,1)
y = np.arange(0,1)
x,y = np.meshgrid(x,y)
z = np.array([
    [0,1,0],[1,2,1],3,[0,0]])

surf = ax.plot_surface(x,y,z,cmap=cm.cool)
plt.show()

如何插入数据以使表面更平滑?理想情况下,我想使用样条插值(类似于 this example)。因此,我尝试使用 interpolate.bisplrep from Scipy 但遇到了各种 TypeError: len(x)==len(y)==len(z) must hold 错误。如何准备数据?

解决方法

interpolate.bisplrep 要求使用 x,y 排列 meshgrid 边:

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from scipy import interpolate

fig,ax = plt.subplots(subplot_kw={"projection": "3d"})

x = np.arange(0,4,1)
y = np.arange(0,1)
x,y = np.meshgrid(x,y)
z = np.array([
    [0,1,0],[1,2,1],3,[0,0]])

# new grid is 40x40
xnew = np.linspace(0,num=40)
ynew = np.linspace(0,num=40)
tck = interpolate.bisplrep(x,y,z,s=0)
znew = interpolate.bisplev(xnew,ynew,tck)

xnew,ynew = np.meshgrid(xnew,ynew)

surf = ax.plot_surface(xnew,znew,cmap=cm.cool)
plt.show()

Matplotlib 3D surface interpolated

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。