python - 3D Polar Plot - griddata 不允许三次插值,只有线性插值导致 "unsmooth"图

标签 python numpy matplotlib scipy

我正在绘制天线周围场强的 3D 极坐标图。数据示例如下所示:

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,其中包含每个唯一点的半径、角度和场强的线性值。

我想绘制值的 3D 极坐标图。为此,我将 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。这些值是什么?

最佳答案

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

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

根据 interp2D 文档,它实际上只是调用 bisplrep ( doc ),您可以直接使用它,并让您可以访问更多旋钮.

要获得“抑制”插值,您将不得不接受对原始数据进行某种程度的平滑处理。是否可以由您决定。

关于python - 3D Polar Plot - griddata 不允许三次插值,只有线性插值导致 "unsmooth"图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16040277/

相关文章:

Python 不能返回函数值?

python - 在一个时间间隔内运行一个 Asyncio 循环

python - 如何在 Python 中的函数入口、内部和导出处进行日志记录

python - 我不明白普通波兰语表示法(NPN 或 PN)。如何在 Odoo 中构建复杂域?

python - 重新排序 numpy 数组索引

python - 如何使用numpy的asarray函数在Python中读取 boolean 数据文件

python - 从 2 个不同 .csv 文件中找到的 2 个数组中减去元素

python - 双轴上的刻度和标签

python - 与 Matplotlib 图中的曲线交互

python - 如何从位掩码绘制多边形面片