Python 无法将'scipy.interpolate.RectBivariateSpline'与'matplotlib.pyplot,plot_surface'一起使用`
我试图建立一个最小的例子来重现我遇到的问题。请忽略随机生成的数据数组Python 无法将'scipy.interpolate.RectBivariateSpline'与'matplotlib.pyplot,plot_surface'一起使用`,python,numpy,scipy,interpolation,Python,Numpy,Scipy,Interpolation,我试图建立一个最小的例子来重现我遇到的问题。请忽略随机生成的数据数组x和y。我正在向zSpline调用内部plot\u曲面中输入非常有意义的数据。您可以尝试将倒数第二行替换为-surf=ax.plot_surface(xg,yg,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)其中我将ZSpline替换为粗略数据z。这表明我在语法上没有弄错 我的代码是- import numpy as np from mpl_toolkits.mplot
x
和y
。我正在向zSpline
调用内部plot\u曲面
中输入非常有意义的数据。您可以尝试将倒数第二行替换为-surf=ax.plot_surface(xg,yg,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
其中我将ZSpline替换为粗略数据z
。这表明我在语法上没有弄错
我的代码是-
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from scipy.interpolate import RectBivariateSpline
size=21
dat = np.random.randn(size, 2)
x=dat[:,0]
y=dat[:,1]
z=np.random.randn(size//3,size//3)
i=np.tile([1,2,3],size//3)
bool_dat=(i==1)
x_new=x[bool_dat]
y_new=y[bool_dat]
xi=np.linspace(x_new.min(),x_new.max(),size//3)
yi=np.linspace(y_new.min(),y_new.max(),size//3)
#print z.shape,xi.shape,yi.shape
zSpline = RectBivariateSpline(xi,yi,z)
xg,yg = np.meshgrid(xi,yi)
print zSpline(xg,yg)
fig=plt.figure()
ax=fig.gca(projection='3d')
surf=ax.plot_surface(xg,yg,zSpline(xg,yg),rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
plt.show()
我得到的错误是-
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-a98e6c15985e> in <module>()
22
23 xg,yg = np.meshgrid(xi,yi)
---> 24 print zSpline(xg,yg)
25 fig=plt.figure()
26 ax=fig.gca(projection='3d')
/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack2.pyc in __call__(self, x, y, mth)
671 z,ier = dfitpack.bispev(tx,ty,c,kx,ky,x,y)
672 if not ier == 0:
--> 673 raise ValueError("Error code returned by bispev: %s" % ier)
674 return z
675 raise NotImplementedError('unknown method mth=%s' % mth)
ValueError: Error code returned by bispev: 10
这将为我提供以下图像作为输出。
但是,如果使用zSpline,则会引发错误
编辑2:
如果我使用xg,yg=np.ogrid[-np.pi:np.pi:size*1j,-np.pi:np.pi:size*1j]
而不是meshgrid,问题就会自行解决。但我还是不知道为什么 见
问题是,您给样条线的xg和yg是二维数组,但例程希望它们是定义网格的一维数组(即
xi,yi
)。An。(也许这有一点帮助)有可能探测数据是如何无效的吗?这是我的第一个猜测,但没有提出ValueError
。没有提出ValueError
,但你得到了一个不同的错误并不意味着什么。此处的文档是正确的。mgrid
版本在没有样条曲线的情况下运行较早。不过,根据文档,你肯定是对的。
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from scipy.interpolate import RectBivariateSpline
size=21
xi=np.linspace(-np.pi,np.pi,size)
yi=np.linspace(-np.pi,np.pi,size)
xg,yg = np.meshgrid(xi,yi)
z=np.sin(xg)*np.sin(yg) #nice and smooth function
zSpline = RectBivariateSpline(xi,yi,z,kx=2,ky=2)
fig=plt.figure()
ax=fig.gca(projection='3d')
surf=ax.plot_surface(xg,yg,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
#surf=ax.plot_surface(xg,yg,zSpline(xg,yg),rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
plt.show()