为什么Matplotlib不能在不同的线程中绘图?
为什么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
只有一个唯一的当前图形。