插值1D非功能数据点

时间:2014-05-12 19:10:55

标签: python matplotlib scipy interpolation

我很难找到数据点的插值。该线应略微类似于负反二次方(即类似于向后' c)。

由于这不是一个函数(x可以有多个y值),我不确定要使用什么插值。

我在想,或许我应该使用像UnivariateSpline这样的东西翻转轴来创建插值点/线,然后在我绘制它时将其翻转回来?

这是仅包含各个点的图表:

scatter plot points of my x-y graph

这是我的代码:

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 :(得分:0)

如图形标题所示"电子密度与Altidude",我想在垂直轴上每个点只有一个值?

这意味着您实际上正在查看已翻转的功能,以使x轴垂直,因为垂直轴上的高度对人类来说更直观。

查看您的代码,似乎已经测量了高度和电子密度的测量值。因此,即使我的上述理论是错误的,您仍然可以在时域中插入所有内容并从中创建样条曲线。

......如果你真的想让曲线完全贯穿每个点,那就是这样。 看到数据中存在多少分散,您应该选择不完全复制每个测量的曲线拟合: scipy.interpolate.Rbf应该正常工作,并且为此你应该切换轴,即计算电子密度作为高度的函数。请确保使用smooth = 0.01或者更多一点(0.0将完全通过每个点并且对噪声数据看起来有点傻)。

...实际上,您的问题似乎是更好地理解您的数据:)