Matplotlib在程序完成之前不会保存绘图图文件

zdwk9cvp  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(143)

我用Pygame做了一个模拟,我想保存一个png文件,里面有一个用Matplotlib做的图,以便在模拟过程中用Pygame显示。这个程序很长,有多个循环。主要线路是:

fig = plt.figure()
...
if not filePath is None:
    plt.savefig(fname=filePath, bbox_inches='tight', format="png")
plt.close()
return fig

这仅在整个程序完成时保存/创建文件。
我试着调用一个函数,它在一个线程中生成绘图,然后等待它完成以结束线程。我试过matplotlib.use('Agg')plt.pause(0.1)。在程序执行期间,这些都不能帮助保存文件。

k2fxgqgv

k2fxgqgv1#

实现此目的的一种方法是将绘图保存在单独的线程中,正如您所尝试的那样。但是,您可能需要确保matplotlib后端设置正确,以便以非阻塞方式保存图。以下是一些建议:
1.将后端设置为非GUI后端:matplotlib的默认后端设计为在窗口中显示绘图,这可能会阻止主线程的执行。您可以通过在脚本顶部添加以下代码行将后端设置为非GUI后端,例如'Agg':

import matplotlib
matplotlib.use('Agg')

这将允许您保存绘图而不会阻塞主线程。
1.使用plt.show(block=False)方法:默认情况下,plt.show()方法会阻止主线程的执行,直到绘图结束。但是,您可以使用block=False参数使其不阻塞。可以按如下方式修改代码:

fig = plt.figure()
...
if not filePath is None:
    plt.savefig(fname=filePath, bbox_inches='tight', format="png")
    plt.close()
else:
    plt.show(block=False)

这将允许您保存绘图而不会阻塞主线程。然后可以使用pygame.image.load()加载保存的图像并在模拟中显示它。
1.使用multiprocessing模块:如果上述方法不起作用,您可以尝试使用multiprocessing模块在单独的进程中运行绘图保存代码。下面是一个例子:

import multiprocessing as mp

def save_plot(filePath):
    fig = plt.figure()
    ...
    plt.savefig(fname=filePath, bbox_inches='tight', format="png")
    plt.close()
    return fig

if __name__ == '__main__':
    p = mp.Process(target=save_plot, args=(filePath,))
    p.start()
    p.join()

这将允许您将绘图保存在单独的进程中,而不会阻塞主线程。然后可以使用pygame.image.load()加载保存的图像并在模拟中显示它。
我希望这有帮助!

相关问题