python - 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
?)
解决方案
最小的后端可能看起来像这样,我们只需从 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()
推荐阅读
- css - R闪亮对齐100 radioGroupButtons 10x10
- google-sheets - 基于相同值的累进 ID 号
- java - Spring Data Redis InvocationTargetException
- python - 包括非素数的素数检查器
- spring-boot - 无法获取登录 Spring Boot 的日期
- css - 我可以计算动态变化的 div 的 CSS 属性的值并使用 calc() 在 CSS 中定位同级 div 的值吗?
- nservicebus - sagas 的并发性有什么价值?
- powershell - 使用 Powershell 扫描 .log 以查找最新行中的特定字符串
- java - Chrome Performance Metrics 上不同方法的不同结果?
- java - 迁移到 Java 9 或更高版本时是否需要切换到模块?