在极坐标图上插值数据后,matplotlib中的等高线出现了伪影

3
我有一些在极坐标格式下取自圆形区域的不规则间隔数据集。我需要进行插值以获得规则间隔网格上的数据,然后我想使用等高线图来绘制它们。
我已经成功进行了插值并绘制了结果,但是我必须将数据从极坐标转换为直角坐标才能进行插值,在将数据转换回极坐标时会在极坐标图上出现伪影。
以下代码展示了我目前的情况,并在极坐标和直角坐标图上绘制了数据:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf

# inputs as 1D arrays
r = np.array([0, 1, 1, 1, 1, 2, 2, 2, 2])
theta = np.radians(np.array([0, 90, 180, 270, 0, 90, 180, 270, 0]))
# z = f(theta, r)
z = np.array([8, 7, 6, 4, 5, 2, 2, 2, 2])

# convert to rect
x = r * np.cos(theta)
y = r * np.sin(theta)

# create RBF for smoothing
rbf = Rbf(x, y, z)

# create grid to smooth over
xi, yi = np.mgrid[-2:2:10j, -2:2:10j]
# smooth
zi = rbf(xi, yi)

# convert back to polar
ri = np.sqrt(xi*xi + yi*yi)
ti = np.arctan2(yi, xi)

# polar plot
fig = plt.figure()
ax = plt.subplot(121, polar=True)
cax = ax.contour(ti, ri, zi, 10, linewidths=0.5, colors='k')
cax = ax.contourf(ti, ri, zi, 10, cmap=plt.cm.Spectral)
ax.set_rmax(2)

# rect plot
ax = plt.subplot(122)
cax = ax.contour(xi, yi, zi, 10, linewidths=0.5, colors='k')
cax = ax.contourf(xi, yi, zi, 10, cmap=plt.cm.Spectral)

plt.show()

剩余的问题包括:

  • 我能否修复轮廓线伪影?
  • Scipy是否提供更适合这种包含极坐标小数据集的插值算法?
1个回答

4
您可能还想阅读这篇文章,但就极坐标中的等高线图而言,matplotlib期望在半径和角度上都有一个规则网格数组,所以您可以这样优美地绘制全部:

# polar plot
ri, ti = np.mgrid[0:2:100j, 0:2*np.pi:100j]
zi = rbf(ri*np.cos(ti), ri*np.sin(ti))

fig = plt.figure()
ax = plt.subplot(121, polar=True)
cax = ax.contour(ti, ri, zi, 10, linewidths=0.5, colors='k')
cax = ax.contourf(ti, ri, zi, 10, cmap=plt.cm.Spectral)
ax.set_rmax(2)

# rect plot
xi, yi = np.mgrid[-2:2:100j, -2:2:100j]
zi = rbf(xi, yi)

ax = plt.subplot(122, aspect='equal')
cax = ax.contour(xi, yi, zi, 10, linewidths=0.5, colors='k')
cax = ax.contourf(xi, yi, zi, 10, cmap=plt.cm.Spectral)
plt.show()

enter image description here

我有点惊讶于你使用了Rbf。你究竟是在做什么,为什么要使用那个插值器呢?


嗯,Rbf是我唯一能够使用的插值器。 griddata 遮盖了太多(最终得到菱形),而我从未能够使 BivariateSpline 类工作。如果您知道其他更适合的插值器,我很乐意听取建议。 - Carson Morrow
@CarsonMorrow 重点是Rbf不是插值,而是外推,除非你知道自己在做什么,否则可能与“捏造数据”相同。您得到的钻石形状实际上显示了您提供的点的凸包。如果您在外半径处有6个点,则会得到一个六边形。如果不更详细地了解您的数据来自何处,则很难为更好的插值器提出建议。 - Jaime
谢谢提供信息。我需要对最合适的插值器进行一些研究。 - Carson Morrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接