matplotlib:如何创建原始后端

hog*_*1e3 5 python matplotlib

以下程序不适用于非 GUI 环境。我想让这个程序在plt.show调用时将图形保存到一个临时的 png 文件中。

import matplotlib.pyplot as plt
plt.scatter(2,3)
plt.scatter(4,5)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过使用plt.savefig代替plt.show(cf. Save plot to image file 而不是使用 Matplotlib 显示它) 来解决。但我不想改变程序本身。该程序可能由熟悉在 GUI 环境中使用 matplotlib 的其他用户提供。

所以我考虑将 matplotlib 的后端更改为我自己的后端,从而改变show. 可以通过更改来完成matplotlibrc。但是关于后端的文档只解释了如何选择“内置”后端:https ://matplotlib.org/faq/usage_faq.html ? highlight = backend#coding-styles

文档说backend可以指定为module://my_backend,但是它没有定义my_backend(应该在哪些名称中实现什么样的类/对象?)的“接口”

有没有解释后端接口的文档?(或其他一些解决方法更改行为show?)

Imp*_*est 4

最小的后端可能如下所示,我们只需从聚合后端获取图形画布(因此能够使用所有关联的方法)

from matplotlib.backend_bases import Gcf
from matplotlib.backends.backend_agg import FigureCanvasAgg

FigureCanvas = FigureCanvasAgg

def show(*args, **kwargs):
    for num, figmanager in enumerate(Gcf.get_all_fig_managers()):
        figmanager.canvas.figure.savefig(f"figure_{num}.png")
Run Code Online (Sandbox Code Playgroud)

如果将其另存为mybackend.py,则可以通过将其用作后端matplotlib.use("module://mybackend")

import matplotlib
matplotlib.use("module://mybackend")
import matplotlib.pyplot as plt

plt.figure()
plt.plot([1,3,2])

plt.figure()
plt.scatter([1,2,3], [3,2,3], color="crimson")

plt.show()
Run Code Online (Sandbox Code Playgroud)