matplotlib: как создать оригинальный бэкэнд - PullRequest
2 голосов
/ 29 сентября 2019

Следующая программа не работает в средах без графического интерфейса.Я хочу, чтобы эта программа сохраняла рисунок во временный png-файл при вызове plt.show.

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

Я знаю, что это можно решить, используя plt.savefig вместо plt.show (ср. Сохранить график в файл изображения вместо его отображения с помощью Matplotlib ).Но я не хочу менять саму программу.Программа может быть предоставлена ​​другим пользователем, который может быть знаком с использованием matplotlib в средах с графическим интерфейсом пользователя.

Поэтому я считаю необходимым изменить внутреннюю часть matplotlib на свою собственную, которая изменяет поведение show.Это можно сделать, изменив matplotlibrc.Но документ о бэкэнде объясняет только, как выбрать «встроенные» бэкэнды: https://matplotlib.org/faq/usage_faq.html?highlight=backend#coding-styles

В документе говорится, что бэкэнд можно указать как module://my_backend, но он не определяет «интерфейс» для my_backend (какой класс / объект должен быть реализован в каких именах?)

Существуют ли какие-либо документы, объясняющие интерфейс бэкэндов?(Или какое-то другое поведение обходного изменения show?)

1 Ответ

2 голосов
/ 29 сентября 2019

Самый минимальный бэкэнд может выглядеть следующим образом, где мы просто берем холст рисунка из бэкэнда 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...