使用plot()绘制线条时为什么matplotlib会变慢?

时间:2016-01-08 17:11:58

标签: python performance matplotlib plot

我想知道为什么当我使用matplotlib绘制线条时会非常慢?如何解决?

Belows是演示代码。它使用plot()在两个随机生成的点之间绘制一条线。

在我的电脑上,' END = 100/200/500'结果' FPS = 36.9 / 28.6 / 20'。我需要无尽的画线,而且时间会变得更糟。怎么解决? 谢谢!

import numpy as np
import matplotlib.pyplot as plt
import time

def draw_demo():
    x = 100
    plt.axis([0, x, 0, 1])
    plt.ion()

    last = 50
    TIME = 5
    END = 1000
    time_start = time.time()

    for i in range(0, END):
        random_num = np.random.random()

        if i > 70:
            plt.axis([x - 100, x + 1, 0, 1])
            x += 1

        plt.plot([i, i + 1], [last, random_num])
        last = random_num

        plt.pause(0.0001)

    print ('FPS:', END/(time.time()-time_start))
    raw_input()

if __name__ == '__main__':
    draw_demo()

2 个答案:

答案 0 :(得分:2)

尝试类似:

import numpy as np
import matplotlib.pyplot as plt
import time

def draw_demo2(ax):
    x = 100
    ax.set_xlim([x-100, x + 250])
    ax.set_ylim([0, 1])

    END = 250
    time_start = time.time()

    ln, = ax.plot([], [])
    x_data = []
    y_data = []
    for i in range(0, END):
        random_num = np.random.random()

        if i%100 == 99:
            cur_xlim = ax.get_xlim()
            ax.set_xlim(np.array(cur_xlim) + 100)
        x += 1
        x_data.append(x)
        y_data.append(random_num)
        ln.set_data(x_data, y_data)
        ax.figure.canvas.draw_idle()
        ax.figure.canvas.flush_events()

    print ('FPS:', END/(time.time()-time_start))


if __name__ == '__main__':
    draw_demo()

将x和y数据缓冲区截断到视图范围可能是值得的(因为每次绘制屏幕时列表都会转换为数组。

如果您需要快速查看blitting,但是这与更改限制不能很好地相互作用,重新绘制文本是绘制图形的最慢部分之一。

同时尝试qt而不是tk,我看到这个变化加速了4倍。

答案 1 :(得分:0)

matplotlib随着脚本的进展而变得越来越慢,因为它正在重新绘制您之前绘制的所有行 - 甚至是已经滚动屏幕的行。