如何使用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间隔不均匀而出现问题。
答案 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()