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

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

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

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

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

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

5
hoge1e3 29 Сен 2019 в 09:58

1 ответ

Лучший ответ

Наиболее минимальная бэкэнда может выглядеть так, куда мы просто принимаем фигуру холст от Backend 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, вы можете использовать его как Backend через 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()
3
ImportanceOfBeingErnest 29 Сен 2019 в 12:37