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.
从这里我基本上删除了除函数 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
.
在 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.
从这里我基本上删除了除函数 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
.