Python 带样条线的平滑线+;datetime对象没有';行不通
我一直在尝试使绘图更平滑,但我的X是datetime对象,与linspace不兼容 我将Xs转换为matplotlib日期:Python 带样条线的平滑线+;datetime对象没有';行不通,python,datetime,matplotlib,scipy,interpolation,Python,Datetime,Matplotlib,Scipy,Interpolation,我一直在尝试使绘图更平滑,但我的X是datetime对象,与linspace不兼容 我将Xs转换为matplotlib日期: Xnew = matplotlib.dates.date2num(X) X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10) Y_smooth = spline(Xnew, Y, X_smooth) 但我得到了一个空的情节,因为我的Y_是平滑的 [0.0.0.0.0.0.0.0.0.0.0.] 不知什么原因 我怎样才能做到
Xnew = matplotlib.dates.date2num(X)
X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10)
Y_smooth = spline(Xnew, Y, X_smooth)
但我得到了一个空的情节,因为我的Y_是平滑的
[0.0.0.0.0.0.0.0.0.0.0.]
不知什么原因
我怎样才能做到这一点
编辑
以下是我打印变量时得到的结果,我没有看到任何异常:
X : [datetime.date(2016, 7, 31), datetime.date(2016, 7, 30), datetime.date(2016, 7, 29)]
X new: [ 736176. 736175. 736174.]
X new max: 736176.0
X new min: 736174.0
XSMOOTH [ 736174. 736174.22222222 736174.44444444 736174.66666667
736174.88888889 736175.11111111 736175.33333333 736175.55555556
736175.77777778 736176. ]
Y [711.74, 730.0, 698.0]
YSMOOTH [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
您的
X
值是反向的,scipy.interpolate.spline
要求自变量单调递增,此方法已被弃用-改用interp1d
(见下文)
请注意,许多样条插值方法要求X
单调递增:
x
:(N,)数组类似于-独立输入数据的一维数组。一定在增加
x
:(N,)类似数组-数据点的输入维度-必须增加
scipy.interpolate.spline
的默认顺序为三次。由于只有3个数据点,三次样条曲线(order=3
)和二次样条曲线(order=2
)之间存在很大差异。下图显示了不同阶样条曲线之间的差异;注:100点用于更平滑拟合曲线
的文档不明确,表明可能不支持该文档。例如,它未列在或上。显示它实际调用和,如下所示:
为向后兼容而存在的函数(不应在新代码中使用)
我会按照你的建议使用。这是当前建议的方法,它在和API中有很好的文档记录,并且默认情况下允许对自变量进行未排序(任意顺序)(请参见API中的假定\u排序
参数)
如果数据排名不足,它也会引发错误
>>> f = interp1d(X, Y, kind='cubic')
ValueError:x和y数组必须至少有4个条目
我刚刚试过一个例子,你的方法对我很有效。试着调试每一行。
Xnew.min()和Xnew.max()的值是多少?发布更多细节。X
,X\u平滑
,Xnew
的值是多少。用于或可能用于在执行过程中查看中间值。我编辑了问题并添加了变量。从您的输出中,我推断您的问题在于样条曲线,而不是日期时间。你能重新措辞你的问题吗?也许可以用一组较小的数字来解决问题,比如10而不是300,这样在SO中显示起来更容易,调试起来也更容易。同时仔细检查np.splie
docs我用10做了同样的事情,但没有区别。。这些文档很小,没有示例:,没有什么可学的;(我想你想从scipy那里得到interp1d
。它可以做一些样条方差。顺序重要吗?如果你用负斜率样条线性线呢?X随着Y的减小而增大……我不知道,也许,我没有读过scipy.interpolate.spline
上的文档,但这不重要,np.linspace
Xsmooth>的输出
与原始输入相反,Xnew
,所以这就是问题所在,它不一致。无法解释..当我按照你说的做时:newX=list(reversed(matplotlib.dates.date2num(X)))Y=list(reversed(Y))X_smooth=np.linspace(min(newX),max(newX),10)Y_smooth=spline(newX,Y,xooth)
我得到:[755.1000.68447671 1062.10559586 991.91003112 842.74445597 667.25554403 518.08996888 447.89440414 509.31552329 755.]
对于这个Y:[755.0,755.0,755.0]
我觉得绘制数据可能会更好地了解问题的目的。我的观点是……反转不起作用,但cricket的interp1d效果很好,谢谢大家的帮助
>>> spline(
... list(reversed(X)), # <-- reverse order of X so also
... list(reversed(Y)), # <-- reverse order of Y to match
... Xsmooth
... )
array([ 698. , 262.18297973, 159.33767533, 293.62017489,
569.18656683, 890.19293934, 1160.79538066, 1285.149979 ,
1167.41282274, 711.74 ])
>>> from scipy.interpolate import interp1d
>>> f = interp1d(X, Y, kind='quadratic')
>>> f(Xsmooth)
array([ 711.74 , 720.14123457, 726.06049383, 729.49777778,
730.45308642, 728.92641975, 724.91777778, 718.4271605 ,
709.4545679 , 698. ])
>>> f = interp1d(X, Y, kind='cubic')