Как переключать бэкэнды в matplotlib / Python
Я борюсь со следующей проблемой. Мне нужно генерировать отчеты, которые состоят из коллекции графиков. Все эти диаграммы, кроме одной, сделаны с использованием стандартного бэкэнда Matplotlib (TkAgg). Один график должен быть сделан с использованием бэкэнда Cairo, причина в том, что я строю график igraph, и его можно построить только с помощью Cairo.
Проблема в том, что я не могу изменить бэкэнды на лету, например, следующее не работает:matplotlib.pyplot.switch_backend('cairo.png')
(Я знаю, что функциональность switch_backend является экспериментальной)
и я тоже пытался matplotlib.use("cairo.png")
но это приводит к проблемам с импортом, поскольку matplotlib.use("cairo.png")
заявление должно прийти перед импортом matplotlib.pyplot
, но мне нужны два разных бэкэнда на протяжении всего сценария.
Итак, у меня вопрос: есть ли у кого-нибудь фрагмент кода, который показывает, как переключить бэкэнд в Matplotlib?
Спасибо!
ОБНОВЛЕНИЕ: я написал фрагмент, который загружает 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: у меня вчера было серьезное замораживание мозга... Самое простое и очевидное решение - использовать бэкэнд Каира для всех графиков, а не переключать бэкенд вообще:)
ОБНОВЛЕНИЕ 3: На самом деле, это все еще проблема, поэтому любой, кто знает, как динамически переключать бэкэнды matplotlib..., пожалуйста, оставьте свой ответ.
9 ответов
Шесть лет спустя, и я столкнулся с похожей проблемой, пытаясь решить, какие 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
Как вы можете сделать вывод, обманывая 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 бэкэндов;
список бэкэндов Gui;
и затем попытайтесь использовать каждый бэкэнд 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")
Есть "экспериментальная" функция:
import matplotlib.pyplot as plt
plt.switch_backend('newbackend')
взято из matplotlib док.
Переключите бэкэнд по умолчанию на newbackend. Эта функция является экспериментальной, и ожидается, что она будет работать только при переключении на бэкэнд изображения. Например, если у вас есть несколько сценариев PostScript, которые вы хотите запустить из интерактивного сеанса ipython, вы, возможно, захотите переключиться на серверную часть PS перед запуском, чтобы избежать появления всплывающих окон GUI. Если вы попытаетесь интерактивно переключиться с одного интерфейса GUI на другой, вы взорветесь. Вызов этой команды закроет все открытые окна.
Почему бы просто не использовать reload
встроенная функция (importlib.reload
в питоне 3)?
import matplotlib
matplotlib.use('agg')
matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
Поэтому я не совсем уверен, что это то, что вы ищете.
Вы можете изменить свой бэкэнд через файл matplotlibrc, который содержит определенные конфигурации для вашего matplotlib.
В вашем скрипте вы можете поместить:
matplotlib.rcParams['backend'] = 'TkAgg'
или что-то подобное для переключения между бэкэндами.
В моем случае (Windows 10 + python 3.7) первый ответ @Rolf of Saxony не сработал очень хорошо. Вместо того, чтобы пробовать все доступные среды и настраивать одну из них в начале, т. Е. Сразу после
import matplotlib
Мне пришлось изменить среду с "Agg" на "TkAgg", используя
matplotlib.use('TKAgg',warn=False, force=True)
прямо перед кодом, где я на самом деле построил, то есть
import matplotlib.pyplot as plt
fig = plt.figure()
# AND SO ON....
Если вы используете консоль IPython (в том числе в Spyder), вы можете использовать встроенные магические команды для быстрого переключения бэкэндов, например:
%matplotlib qt
Получите список доступных бэкэндов для использования с командой:
%matplotlib --list
Доступные серверные модули matplotlib: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', 'svg', 'pdf', 'ps', 'inline', 'ipympl', 'widget']
Extra Info
Хотя каждый демонстрирует свой любимый бэкэнд, довольно сложно понять, что вам нужно установить и каковы требования. По крайней мере, когда вы пытаетесь разобраться в сбивающей с толку и технократической документации. Сегодня я провел несколько экспериментов и думаю, что нашел самые простые решения для каждой серверной части, чтобы иметь возможность строить графики с помощью matplotlib в Windows и с использованием Py3.8.5 (без встроенного Qt). Вот мои выводы:
#--------------------------------------
# Installing the matplotlib backends
#--------------------------------------
# https://matplotlib.org/users/installing.html
pip install pycairo # [1] Cairo : GTK3 based backend (replaces: cairocffi) [1.2 Mb]
#pip install mplcairo # [1] Cairo : Easy & Specific for matplotlib [1.7 Mb]
#pip install PyQt5 # [2] Qt5 : Require: Qt's qmake tool []
pip install PySide2 # [3] Qt5 : Require: shiboken2 & Clang lib bindings [136 Mb]
pip install wxPython # [4] WxAgg : ?? [18.1 Mb]
pip install tornado # [5] WebAgg: Require: pycurl,twisted,pycares ?? [422 kb]
Вот ссылки на все эти PyPi или Repos:
[1] https://pypi.org/project/pycairo/ # Requires GTK3+: https://www.gtk.org/
[1] https://pypi.org/project/mplcairo/ # https://github.com/matplotlib/mplcairo
[2] https://pypi.org/project/PyQt5/ #
[3] https://pypi.org/project/PySide2/ #
[4] https://pypi.org/project/wxPython/ # https://github.com/wxWidgets/Phoenix/
[4] https://github.com/wxWidgets/wxWidgets/releases
[5] https://pypi.org/project/tornado/ # https://github.com/tornadoweb/tornado
Однако, что очень удивительно, учитывая огромное количество документации по использованию
Tcl/Tk
и
tkinter
пакеты для python, мне не удалось установить его и найти какие-либо полезные инструкции о том, как импортировать DLL в python. (Для Linux это тривиально, поскольку вы просто используете диспетчер пакетов ОС
apt-get install <tk-what-not>
, но эта опция недоступна для windows, и нет простого аналога. Вот список множества разнообразных двоичных файлов, которые вы можете получить.
[6] http://www.bawt.tcl3d.org/download.html # Use Tcl-Pure (no additional packages)
[6] https://www.magicsplat.com/tcl-installer/index.html #
[6] https://www.irontcl.com/ #
[6] https://www.activestate.com/products/tcl/downloads/ #
[6] http://tclkits.rkeene.org/fossil/wiki/Downloads #
[6] http://kitcreator.rkeene.org/kitcreator #
Возможно, кто-то может просветить меня, как импортировать что-либо из этого в python?
What backends are available and where?
Давайте просветимся следующими остротами:
python.exe -c "import matplotlib as m; help(m);"
python.exe -c "import matplotlib as m; print('I: {}\nN: {}'.format(m.rcsetup.interactive_bk,m.rcsetup.non_interactive_bk));"
# I: ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo']
# N: ['agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']
python.exe -c "import matplotlib as m; p=m.get_backend();print('current backend is:',p);"
# agg
python.exe -c "import matplotlib as m; p=m.matplotlib_fname(); print('The matplotlibrc is located at:\n',p);"
# C:\Python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc
Setting the back-end
Как сказано в документации: Существует 3 способа настройки серверной части:
- Установка
rcParams["backend"]
(по умолчанию: 'agg') параметр в вашем файле matplotlibrc - Установка
MPLBACKEND
переменная окружения (оболочки) - Используя функцию
matplotlib.use()
Using the backend
Наконец, чтобы использовать доступный бэкэнд, достаточно сделать следующее:
import matplotlib
#matplotlib.use('tkagg', force=True) # Agg rendering to a Tk canvas
#matplotlib.use('wxcairo', force=True) # Cairo rendering to a wxWidgets canvas
#matplotlib.use('wxagg', force=True) # Agg rendering to a wxWidgets canvas
matplotlib.use('webagg', force=True) # On show() will start a tornado server with an interactive figure.
#matplotlib.use('qt5cairo', force=True) # Cairo rendering to a Qt5 canvas
#matplotlib.use('qt5agg', force=True) # Agg rendering to a Qt5 canvas
import matplotlib.pyplot as plt
Чтобы навсегда изменить бэкэнд, вы можете использовать это:
Сначала найдите
matplotlibrc
файл:import matplotlib matplotlib.matplotlib_fname() # '/Users/serafeim/.matplotlib/matplotlibrc'
Откройте терминал и выполните:
cd /Users/serafeim/.matplotlib/ ls
Отредактируйте файл (если он не существует, используйте эту команду:
touch matplotlib
создать его):vim matplotlibrc
Добавьте эту строку и сохраните:
backend: TkAgg
Вы также можете использовать другой процесс Python для создания этого графика, возможно, с помощью pickle или joblib.