使用matplotlib平滑折线图

时间:2017-01-22 13:21:43

标签: python matplotlib interpolation

我已经尝试过在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]

enter image description here

虽然我不太喜欢取得的效果,但原因是例如在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')

0 个答案:

没有答案