Как переключить backend в matplotlib / Python

Я борюсь со следующей проблемой. Мне нужно создать отчеты, которые состоят из набора диаграмм. Все эти диаграммы, кроме одного, создаются с использованием базового компонента Matplotlib по умолчанию (TkAgg). Одна диаграмма должна быть сделана с использованием Cairo-бэкэнд, причина в том, что я рисую графический график, и это можно сделать только с использованием Каира.

Проблема в том, что я не могу менять серверы «на лету», например, следующее не работает:
matplotlib.pyplot.switch_backend('cairo.png') (я знаю, что функция switch_backend является экспериментальной)

и я также попробовал matplotlib.use("cairo.png") но это приводит к проблемам с импортом, поскольку matplotlib.use("cairo.png") должен появиться перед импортом matplotlib.pyplot . но мне нужно два разных бэкэнда в течение жизни сценария.

Итак, мой вопрос: есть ли у кого-нибудь фрагмент кода, который показывает, как переключить сервер в Matplotlib?

Спасибо!

UPDATE: я написал фрагмент, который загружает matplotlib, показывает бэкэнд по умолчанию, выгружает matplotlib, перезагружает его и изменяет бэкэнд:

 import matplotlib import matplotlib.pyplot as plt import sys print matplotlib.pyplot.get_backend() modules = [] for module in sys.modules: if module.startswith('matplotlib'): modules.append(module) for module in modules: sys.modules.pop(module) import matplotlib matplotlib.use("cairo.png") import matplotlib.pyplot as plt print matplotlib.pyplot.get_backend() 

но действительно ли это способ сделать это?

ОБНОВЛЕНИЕ 2: вчера у меня было серьезное замораживание мозга … Простым и наиболее очевидным решением является использование бэкэнда Cairo для всех графиков, а не для переключения бэкэнда вообще 🙂

ОБНОВЛЕНИЕ 3: Вообще-то, это все еще проблема, поэтому любой, кто знает, как динамически переключаться на backplatb matplotlib …., пожалуйста, напишите свой ответ.

Существует «экспериментальная» особенность:

 import matplotlib.pyplot as p p.switch_backend('newbackend') 

взято из matplotlib doc .

Переключите бэкенд по умолчанию в newbackend. Эта функция является экспериментальной , и ожидается, что она будет работать, переключаясь на бэкэнд изображения. Например, если у вас есть куча скриптов PostScript, которые вы хотите запустить из интерактивного сеанса ipython, вы можете переключиться на бэкэнд PS перед их запуском, чтобы избежать появления кучи окон графического интерфейса. Если вы попытаетесь в интерактивном режиме переключиться с одного GUI-сервера на другой, вы взорветесь. Вызов этой команды закроет все открытые окна.

Почему бы просто не использовать встроенную функцию importlib.reload ( importlib.reload в Python 3)?

 import matplotlib matplotlib.use('agg') matplotlib = reload(matplotlib) matplotlib.use('cairo.png') 

Шесть лет спустя, и я столкнулся с подобной проблемой, пытаясь решить, какой backend был доступен для использования.
Этот фрагмент кода хорошо работает для меня:

 import matplotlib gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg'] for gui in gui_env: try: print "testing", gui matplotlib.use(gui,warn=False, force=True) from matplotlib import pyplot as plt break except: continue print "Using:",matplotlib.get_backend() Using: GTKAgg 

Как вы можете вывести, замена matplotlib.pyplot backend так же просто, как повторный импорт matplotlib.pyplot после форсирования нового backend

 matplotlib.use('WXAgg',warn=False, force=True) from matplotlib import pyplot as plt print "Switched to:",matplotlib.get_backend() Switched to: WXAgg 

Для тех, у кого по-прежнему возникают проблемы, этот код распечатает:
список небанковских бэкендов;
список бэкэндов Гви;
а затем попытайтесь использовать каждый бэкэнд Gui, чтобы узнать, присутствует ли он и работает ли он.

 import matplotlib gui_env = [i for i in matplotlib.rcsetup.interactive_bk] non_gui_backends = matplotlib.rcsetup.non_interactive_bk print ("Non Gui backends are:", non_gui_backends) print ("Gui backends I will test for", gui_env) for gui in gui_env: print ("testing", gui) try: matplotlib.use(gui,warn=False, force=True) from matplotlib import pyplot as plt print (" ",gui, "Is Available") plt.plot([1.5,2.0,2.5]) fig = plt.gcf() fig.suptitle(gui) plt.show() print ("Using ..... ",matplotlib.get_backend()) except: print (" ",gui, "Not found") 

Вы могли бы также иметь другой процесс Python, чтобы сделать этот график, возможно, с помощью pickle или joblib .

Поэтому я не совсем уверен, что это то, что вы ищете.

Вы можете изменить свой backend через файл matplotlibrc, который содержит определенные конфигурации для вашего matplotlib.

В вашем скрипте вы можете поставить:

 matplotlib.rcParams['backend'] = 'TkAgg' 

или что-то подобное, чтобы переключаться между бэкэндами.