3D极坐标图 - griddata不允许三次插值,只有线性导致“不平滑”图

时间:2013-04-16 14:53:18

标签: python numpy matplotlib scipy

我正在绘制天线周围场强的三维极坐标图。数据样本如下所示:

0.5  0  -22
0.5  0  -21
0.5  0  -22
0.5  0  -21
0.5  0  -22
0.5  0  -22
0.5  0  -22
0.5  0  -22

第1列是距天线的半径,第2列是天线周围的角度,第3列是场强的dBm值。

我在每个点都采用了一些样本,这些样本是由我的脚本平均的。 3个相应的列表R,P和Z,它们包含每个唯一点处场强的半径,角度和线性值。

我想绘制值的三维极坐标图。为此,我将R和P值从极坐标转换为笛卡尔坐标X和Y.

# transform them to cartesian system 
X,Y = R*np.cos(P),R*np.sin(P) 

然后我使用以下代码来插入数据

xi = np.linspace(X.min(),X.max(),100)
yi = np.linspace(Y.min(),Y.max(),100)

zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='linear')

然后我创建一个网格并按如下方式绘制数据

xig, yig = np.meshgrid(xi, yi)

surf = ax.plot_surface(xig, yig, zi,linewidth=0)
plt.show()

这会创建以下图

Plot

有没有办法让表面更光滑?使用griddata type = cubic插值数据不起作用,只用“nan”值填充矩阵zi。也许有更好的3D替代方案或者我做错了什么?

使用建议的interp2d函数刚刚导致zi被填充为nan值。我通过以下方式使用它:

zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='linear')
interp2d(xi, yi, zi, kind='cubic')

zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='linear')
zi = interp2d(xi, yi, zi, kind='cubic')

两者都给出了以下错误,

Warning:     No more knots can be added because the number of B-spline coefficients
already exceeds the number of data points m. Probably causes: either
s or m too small. (fp>s)
kx,ky=3,3 nx,ny=104,105 m=10000 fp=nan s=0.000000

我也试过

interp = interp2d(X,Y,Z,kind='cubic'); new_zi = interp(xi, yi)

这给了我一个类似的错误:

Warning:     No more knots can be added because the number of B-spline coefficients
already exceeds the number of data points m. Probably causes: either
s or m too small. (fp>s)
kx,ky=3,3 nx,ny=14,15 m=104 fp=nan s=0.000000

虽然m要小得多。

看起来问题是s为0且fp = nan。这些价值是什么?

1 个答案:

答案 0 :(得分:1)

s是设置来自给定点的误差的参数(即插值曲面可以错过源点的距离)。如果s=0,则插值必须精确地击中每个点。如果您的数据中存在噪声,则较高的导数将不会是平滑的,它将转向1)使您的拟合表面看起来很糟糕,因为它会使自身扭曲成值更高的导数2)要求< em>很多的控制点。

对于噪声数据,高阶插值实际上可能比线性插值差得多。

根据interp2D文档,它实际上只是调用bisplrepdoc),您可以直接使用它,并且可以访问更多旋钮。

要进行'闷烧'插值,您将不得不接受一定程度的原始数据平滑。如果可以,那取决于你。