为什么Matplotlib不能在不同的线程中绘图?

10 浏览
0 Comments

为什么Matplotlib不能在不同的线程中绘图?

最小工作示例

我期望以下代码能显示一个图表,但是我没有看到图表,解释器只是卡住了(我的后端报告是TkAgg)。

import matplotlib.pyplot as plt
from threading import Thread
def plot():
    fig, ax = plt.subplots()
    ax.plot([1,2,3], [1,2,3])
    plt.show()
def main():
    thread = Thread(target=plot)
    thread.setDaemon(True)
    thread.start()
    print '完成'

我如何显示图表?

背景

我正在进行大量迭代的仿真,并希望每1000次迭代更新一次图表,以便我可以监视仿真的演变情况。

伪代码如下:

iterations = 100000
for i in iterations:
    result = simulate(iteration=i)
    if not i % 1000:
        # 在这里更新/重绘图表:
        # 添加一些线条,添加一些点,重置坐标轴限制,改变一些颜色

将图表放在主线程中会导致图表的GUI挂起/崩溃,可能是因为我还有其他工作要做。所以想法是在单独的线程中进行绘图。

我看到有建议(例如这里)建议使用进程而不是线程。但是,当我的仿真运行时,我无法操作图形或坐标轴来添加线条等,因为图形对象在远程进程中。

编辑

我不确定这个问题是否与另一个问题是重复的,因为那个问题涉及为什么不能使用pyplot api来操作两个不同的图表,每个图表都在单独的线程中。这是因为同时执行两个图表导致竞争条件,使得pyplot无法确定哪个图形是当前图形。

然而,我只有一个图表,所以pyplot只有一个唯一的当前图形。

0