小编典典

使用 Matplotlib 以非阻塞方式绘图

all

最近几天我一直在玩 Numpy 和 matplotlib。我在尝试使 matplotlib 绘制一个函数而不阻塞执行时遇到问题。我知道这里已经有很多关于
SO 提出类似问题的线程,而且我已经用谷歌搜索了很多,但还没有设法完成这项工作。

我曾尝试按照某些人的建议使用 show(block=False) ,但我得到的只是一个冻结的窗口。如果我只是调用
show(),结果会被正确绘制,但执行会被阻止,直到窗口关闭。从我读过的其他线程中,我怀疑 show(block=False)
是否有效取决于后端。这个对吗?我的后端是 Qt4Agg。你能看看我的代码,如果你发现有问题告诉我吗?这是我的代码。谢谢你的帮助。

from math import *
from matplotlib import pyplot as plt
print(plt.get_backend())



def main():
    x = range(-50, 51, 1)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4

        y = [Xi**pow for Xi in x]
        print(y)

        plt.plot(x, y)
        plt.draw()
        #plt.show()             #this plots correctly, but blocks execution.
        plt.show(block=False)   #this creates an empty frozen window.
        _ = raw_input("Press [enter] to continue.")


if __name__ == '__main__':
    main()

PS。我忘了说我想在每次绘制某些东西时更新现有窗口,而不是创建一个新窗口。


阅读 224

收藏
2022-06-23

共1个答案

小编典典

看起来,为了得到你(和我)想要的东西,你需要结合plt.ion(),
plt.show()(而不是block=False),最重要的是,plt.pause(.001)(或者你想要的任何时间)。之所以需要暂停,是因为
GUI 事件发生在主代码休眠时,包括绘图。这可能是通过从睡眠线程中获取时间来实现的,所以也许 IDE 会弄乱那个——不知道。

这是一个适用于我在 python 3.5 上的实现:

import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()
2022-06-23