在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(),它会设法获取图像并将其放在活动代码块下面。怎么做的?
答案 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。
从这里我基本上删除了除show
,new_figure_manager
和new_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
。