matplotlib pyplot 显示捕获图像

matplotlib pyplot show capture image

在 python 交互式会话中,以下代码是 运行:

import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show()

如何让 show() 不阻塞并且不实际显示图像,而是将其存储在文件中? 我无法将代码更改为 plt.savefig('figure.png')。 (这是有充分理由的,如果有兴趣我可以解释。)

要走的路似乎是指定自定义后端渲染器,但到目前为止没有成功。是否可以采用现有的后端渲染器并更改 show() 方法以保存到文件? (比方说 "figure%d.png" 到目前为止调用 show() 的次数为 %d。)

也欢迎在自定义后端渲染器旁边提出其他建议。在 IPython notebook 中,如果您执行 plt.show(),它会设法获取图像并将其放置在活动代码块下方。怎么做到的?

您可以使用 here for creating a figure without a gui. This uses FigureCanvasAgg (which is the gui built by default 中的解决方案,您可能会使用不同的解决方案)。然后pyplot中的show就可以猴子补丁了,

import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg

def show(fig=None):

    if fig == None:
        fig = plt.gcf()
    canvas = FigureCanvasAgg(fig)
    canvas.print_figure("./out.png", dpi=80)

plt.show = show    
plt.plot([1,2,3])
plt.show()

不确定这是否可以避免您遇到的 savefig 问题?

我最终为 matplotlib 创建了一个自定义后端。在 matplotlib 包中有一个后端文件夹,其中包含 backend_template.py.

从这里我基本上删除了除函数 shownew_figure_managernew_figure_manager_given_figure 之外的所有内容。后者我稍微适应一下:

canvas = FigureCanvasAgg(figure)
manager = FigureManagerBase(canvas, num)
return manager

我保持 new_figure_manager 不变,并在文件末尾设置了 FigureCanvas = FigureCanvasAgg,这样我基本上可以重用 Agg 后端的大部分功能。然后,您可以根据需要实现 show 功能。

最后一步是设置 matplotlibrc 配置文件并添加一行 backend : module://matplotlib_custom_backend.