<p>我有另一种方法来解决这个问题,使用<code>scipy</code>在闭合曲线上插值。首先,我将数据从(deg,ssi)转换为<em>psuedo</em>笛卡尔坐标(x,y),假设<code>deg</code>是极角,<code>ssi</code>是径向距离的(负)。然后可以使用定义的方法<a href="https://stackoverflow.com/a/33962986/8936101">here</a>将闭合曲线插值到一组(x,y)点上。在</p>
<pre><code>import numpy as np
import pandas
import matplotlib.pyplot as plt
from scipy import interpolate
dic = {'deg': [4.0, 59.0, 162.0, 267.0, 319.0],
'ssi': [-69, -73, -73, -61, -75]}
f44 = pandas.DataFrame(data=dic)
'''
Now, lets do the following. Convert your data from (deg, ssi) to (x,y)
where x = ssi* cosd(deg), y=ssi*sind(deg). Now we need to interpolate a closed
curve onto these set of cartesian points.
'''
f44['x'] = -f44['ssi']*np.cos( np.deg2rad(f44['deg']))
f44['y'] = -f44['ssi']*np.sin( np.deg2rad(f44['deg']))
x = f44.as_matrix(columns=[f44.columns[2]])[:,0]
y = f44.as_matrix(columns=[f44.columns[3]])[:,0]
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]
tck, u = interpolate.splprep([x, y], s=0, per=True)
xi, yi = interpolate.splev(np.linspace(0, 1, 1000), tck)
# Save interpolated data to new dataframe.
f44i = pandas.DataFrame(data = {'x':xi, 'y':yi})
f44i['deg'] = np.rad2deg( np.arctan2(f44i['y'],f44i['x']))
f44i['ssi'] =-np.sqrt( f44i['x']**2 + f44i['y']**2)
for i,l in enumerate(f44i['deg']):
if l < 0:
f44i['deg'][i] = 360 + f44i['deg'][i]
fig, ax = plt.subplots(1, 1)
ax.plot(f44i['deg'], f44i['ssi'], '.', markersize=0.5)
ax.plot(f44['deg'], f44['ssi'], '.', color='red')
plt.show()
</code></pre>
<p>现在我们得到一条曲线,看起来像下面的曲线。(从psuedo笛卡尔坐标重新转换为首选(deg,ssi)坐标)。另外,我还创建了一个新的数据帧来替换您创建的<code>f44i</code>。您可以使此代码更适合您的特定应用程序。在</p>
<p><a href="https://i.stack.imgur.com/2VXvp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2VXvp.png" alt="Interpolation using a closed curve."/></a></p>