我试图构造一个函数,它给出了分段线性函数的插值。我尝试了线性样条插值(它应该能够做到这一点?)-但没有任何运气。这个问题在对数比例图上最明显。下面是我准备的一个小例子的代码:
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os
from scipy import interpolate
# Original Data
pwl_data = np.array([[0,1e3, 1e5, 1e8], [-90,-90, -90, -130]])
# spine interpolation
pwl_spline = interpolate.splrep(pwl_data[0], pwl_data[1])
spline_x = np.linspace (0,1e8, 10000)
legend = []
plt.plot(pwl_data[0],pwl_data[1])
plt.plot(spline_x,interpolate.splev(spline_x,pwl_spline ),'*')
legend.append("Data")
legend.append("Interpolated Data")
plt.xscale('log')
plt.legend(legend)
plt.grid(True)
plt.grid(b=True, which='minor', linestyle='--')
plt.show()
我做错了什么?
2条答案
按热度按时间ih99xse11#
必须对线性化数据进行样条拟合,即,使用
log(x)
代替x
:注意:我把零从数据中去掉了。2另外,如果你想要一个分段线性函数,样条拟合可能不是最好的,你可以看看这个问题,例如:https://datascience.stackexchange.com/q/8457/53362
am46iovg2#
对于使用matplotlib绘图,考虑matplotlibs
step
,它在内部执行分段常数插值。https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.step.html
您可以通过以下方式调用它:
plt.step(x,y)
,给定输入x和y。在散点图中,参数
line_shape='hv'
获得了类似的结果,请参见https://plotly.com/python/line-charts/