首页 > 解决方案 > matplotlib:如何创建原始后端

问题描述

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

import matplotlib.pyplot as plt
plt.scatter(2,3)
plt.scatter(4,5)
plt.show()

我知道这可以通过使用来解决,plt.savefig而不是plt.show(参见将绘图保存到图像文件而不是使用 Matplotlib 显示它)。但我不想改变程序本身。该程序可能由熟悉在 GUI 环境中使用 matplotlib 的其他用户提供。

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

文档说backend可以指定为module://my_backend,但是没有定义my_backend(什么样的Classes/Object应该以哪个名字实现?)的“接口”

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

标签: pythonmatplotlib

解决方案


最小的后端可能看起来像这样,我们只需从 agg 后端获取图形画布(因此能够使用所有关联的方法)

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")

如果将其另存为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()

推荐阅读