在x轴上平滑不均匀间隔的绘图

时间:2017-06-06 08:42:00

标签: python-3.x numpy scipy smoothing

如何使用x轴作为不等间隔的日期来平滑绘图。我的数据是;

import numpy as np
from pylab import plt
import datetime as dt

x = np.array([dt.date(2000, 11, 30), dt.date(2001, 3, 31), dt.date(2001, 11, 30),
                dt.date(2002, 3, 31), dt.date(2002, 11, 30), dt.date(2003, 3, 31),
                dt.date(2003, 11, 30), dt.date(2004, 3, 31), dt.date(2004, 11, 30),
                dt.date(2005, 3, 31), dt.date(2005, 11, 30), dt.date(2006, 3, 31),
                dt.date(2006, 11, 30), dt.date(2007, 3, 31), dt.date(2007, 11, 30),
                dt.date(2008, 3, 31), dt.date(2008, 11, 30), dt.date(2009, 3, 31),
                dt.date(2009, 11, 30), dt.date(2010, 3, 31), dt.date(2010, 11, 30),
                dt.date(2011, 3, 31), dt.date(2011, 11, 30), dt.date(2012, 3, 31),
                dt.date(2012, 11, 30), dt.date(2013, 3, 31), dt.date(2013,11, 30)])

    y = np.array([0, -2.15881, -1.18881, -2.91211,  -2.33211,   -5.06131, -4.24131, -6.04321,   -4.56321,   -6.42431,   -5.68431,   -8.83711,   -8.43711,   -11.02821,
                  -10.66821,    -12.90341,  -11.02341,  -13.77671,  -13.27671,  -13.89671,
                  -12.23671,    -13.89411,  -12.61411])

plt.plot(x, y)

我尝试了scipy spline,但因为x间隔不均匀而出现问题。

1 个答案:

答案 0 :(得分:1)

它对我有用!

您必须将日期转换为数字并使用 scipy.interplolate.spline 来使图表更流畅。

import numpy as np
from pylab import plt
import datetime as dt
from scipy.interpolate import spline
from matplotlib import dates

x = np.array([dt.date(2000, 11, 30), dt.date(2001, 3, 31), dt.date(2001, 11, 30),
                dt.date(2002, 3, 31), dt.date(2002, 11, 30), dt.date(2003, 3, 31),
                dt.date(2003, 11, 30), dt.date(2004, 3, 31), dt.date(2004, 11, 30),
                dt.date(2005, 3, 31), dt.date(2005, 11, 30), dt.date(2006, 3, 31),
                dt.date(2006, 11, 30), dt.date(2007, 3, 31), dt.date(2007, 11, 30),
                dt.date(2008, 3, 31), dt.date(2008, 11, 30), dt.date(2009, 3, 31),
                dt.date(2009, 11, 30), dt.date(2010, 3, 31), dt.date(2010, 11, 30),
                dt.date(2011, 3, 31), dt.date(2011, 11, 30)])

y = np.array([0, -2.15881, -1.18881, -2.91211,  -2.33211,   -5.06131, -4.24131, -6.04321,
               -4.56321,   -6.42431,   -5.68431, -8.83711,   -8.43711,   -11.02821,
               -10.66821,    -12.90341,  -11.02341,  -13.77671,  -13.27671,  -13.89671,
               -12.23671,    -13.89411,  -12.61411])

# create an array of numbers for the dates
x_dates = np.array([dates.date2num(i) for i in x])

plt.figure()
plt.plot(x, y)
plt.show()

# create more uniform intervals in x axis and use spline to interpolate data
x_smooth = np.linspace(x_dates.min(), x_dates.max(), 200)
y_smooth = spline(x_dates, y, x_smooth)

# creating a new date array from the new date number array
x_new = np.array([dates.num2date(i) for i in x_smooth])

plt.figure()
plt.plot(x_new, y_smooth)
plt.show()

所以,最初的数字是:Original Figure

新数字是:Interpolated figure

叠加两个数字,我们看到比赛非常好! Superimposing both the plots