插值1D非函数数据点
我在为我的数据点寻找一种插值方法时遇到了困难。这个线条应该稍微像一个负的反向二次曲线(也就是像一个倒过来的‘c’)。
因为这不是一个函数(x可以对应多个y值),所以我不太确定该用什么插值方法。
我在想,也许我可以先把坐标轴翻转过来,用像UnivariateSpline这样的工具来创建插值点/线,然后在绘图时再把它翻回来?
这是我单独数据点的图:
这是我的代码:
import datetime as dt
import matplotlib.pyplot as plt
from scipy import interpolate
file = open_file("010217.hdf5", mode = "a", title = 'Sondrestrom1')
all_data = file.getNode('/Data/Table Layout').read()
file.close()
time = all_data['ut1_unix'] #time in seconds since 1/1/1970
alt = all_data['gdalt'] #all altitude points
electronDens = all_data['nel'] #all electron density points
x = []
y = []
positions = []
for t in range(len(time)): #Looking at this specific time, find all the respective altitude and electron density points
if time[t] == 982376726:
x.append(electronDens[t])
y.append(alt[t])
positions.append(t)
#FINDING THE DATE
datetime1970 = dt.datetime(1970,1,1,0,0,0)
seconds = long(time[t])
newDatetime = datetime1970 + dt.timedelta(0, seconds)
time1 = newDatetime.strftime('%Y-%m-%d %H:%M:%S')
title = "Electron Density vs. Altitude at "
title += time1
plt.plot(x,y,"o")
plt.title(title)
plt.xlabel('Electron Density (log_10[Ne])')
plt.ylabel('Altitude (km)')
plt.show()
1 个回答
0
根据图表的标题“电子密度与高度”,我猜测在垂直轴上每个点只有一个值,对吧?
这意味着你实际上是在看一个被翻转的函数,为了让x轴变成竖着的,因为把高度放在垂直轴上对人类来说更直观。
从你的代码来看,似乎有一次测量同时记录了高度和电子密度。因此,即使我上面的理论不对,你仍然可以在时间范围内进行插值,并从中创建一个样条曲线。
... 当然,这前提是你真的想要一条经过每个点的曲线。考虑到数据的散布情况,你可能应该选择一种不完全复制每个测量值的曲线拟合方法:scipy.interpolate.Rbf
应该可以正常工作,再次强调,你需要交换坐标轴,也就是说,把电子密度作为高度的函数来计算。只要确保使用smooth=0.01或者稍微多一点(0.0会完全经过每个点,在噪声数据上看起来会有点傻)。
... 实际上,看起来你大部分的问题是更好地理解你的数据 :)