Я борюсь со следующей проблемой. Мне нужно создать отчеты, состоящие из набора диаграмм. Все эти диаграммы, кроме одной, созданы с использованием бэкэнда по умолчанию Matplotlib (TkAgg). Одна диаграмма должна быть создана с использованием бэкэнда Cairo, причина в том, что я строю графический график, который можно построить только с помощью 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: У меня вчера было серьезное зависание мозга ... Простое и наиболее очевидное решение - использовать бэкэнд Cairo для всех диаграмм и вообще не переключать бэкэнд :)
ОБНОВЛЕНИЕ 3: На самом деле, это все еще проблема, поэтому любой, кто знает, как динамически переключать бэкенды matplotlib ... отправьте свой ответ.
источник
pyplot.switch_backends()
. В вашем случае это может не сработать.Ответы:
Шесть лет спустя я столкнулся с аналогичной проблемой, когда пытался решить, какой из них
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 .
источник
Почему бы просто не использовать
reload
встроенную функцию (importlib.reload
в Python 3)?import matplotlib matplotlib.use('agg') matplotlib = reload(matplotlib) matplotlib.use('cairo.png')
источник
python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"
Верно?Поэтому я не совсем уверен, что это то, что вы ищете.
Вы можете изменить свой бэкэнд через файл matplotlibrc, который содержит определенные конфигурации для вашего matplotlib.
В свой скрипт вы можете поместить:
matplotlib.rcParams['backend'] = 'TkAgg'
или что-то в этом роде для переключения между бэкэндами.
источник
~/.config/matplotlib/matplotlibrc
В моем случае (Windows 10 + python 3.7) первый ответ @Rolf из Саксонии не сработал. Вместо того, чтобы пробовать все доступные среды и настраивать одну из них в начале, то есть сразу после
import matplotlib
Мне пришлось изменить среду с «Agg» на «TkAgg», используя
matplotlib.use('TKAgg',warn=False, force=True)
прямо перед кодом, в котором я рисовал, т.е.
import matplotlib.pyplot as plt fig = plt.figure() # AND SO ON....
источник
Чтобы навсегда изменить бэкэнд, вы можете использовать это:
Сначала найдите
matplotlibrc
файл:import matplotlib matplotlib.matplotlib_fname() # '/Users/serafeim/.matplotlib/matplotlibrc'
Откройте терминал и выполните:
Отредактируйте файл (если он не существует, используйте эту команду:
touch matplotlib
для его создания):Добавьте эту строку и сохраните:
источник
Вы также можете использовать другой процесс Python для создания этого графика, возможно, с помощью pickle или joblib .
источник
Если вы используете консоль IPython (в том числе в Spyder), вы можете использовать встроенные магические команды для быстрого переключения серверных модулей, например:
Получите список доступных бэкэндов для использования с командой:
источник