我已经尝试过在Python中平滑折线图的方法,这通过插值来实现并不困难。例如,使用这些数据集,我可以生成此图表。
x = np.linspace(0, 6, num=7)
,A = [3, 4, 5, 3.5, 4.7, 5, 3.6]
和B = [3.4, 4.2, 4.9, 3.7, 4.7, 4.2, 4.6]
虽然我不太喜欢取得的效果,但原因是例如在2017-01-22和2017-01-23之间假设B下降然后上升,我希望那2个连续点仅以增加或减少的方式连接,即B在2017-01-21和2017-01-22范围内平稳增长。
或者在数学上,我希望2个相邻点之间的曲线斜率只是正,负或零。
如何达到预期效果?
这是我现在使用的代码
def generate_graph():
x = np.linspace(0, 6, num=7)
A = [3, 4, 5, 3.5, 4.7, 5, 3.6]
B = [3.4, 4.2, 4.9, 3.7, 4.7, 4.2, 4.6]
A_tck = splrep(x, A)
A_average_tck = splrep(x, B)
dates = [datetime.date.today() - timedelta(6), datetime.date.today() - timedelta(5), datetime.date.today() - timedelta(4), datetime.date.today() - timedelta(3), datetime.date.today() - timedelta(2), datetime.date.today() - timedelta(1), datetime.date.today()]
x_new = np.linspace(x.min(), x.max(), 200)
A_new = splev(x_new, A_tck)
B_new = splev(x_new, A_average_tck)
plt.plot(x_new, A_new, label='A')
plt.plot(x_new, B_new, label='B')
plt.xticks(x, dates, size='small')
plt.grid()
plt.ylabel('Y')
plt.xlabel('X')
plt.legend(loc='best')
plt.savefig('foo.png', bbox_inches='tight')