matplotlib pyplot显示捕获图像

时间:2015-09-16 15:47:14

标签: matplotlib ipython

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用here中的解决方案来创建没有gui的数字。这使用FigureCanvasAgg(由default构建的gui,你可以使用另一个)。然后可以对pyplot中的节目进行猴子修补,

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出现的问题?

答案 1 :(得分:0)

我最终为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