Как изменить бэкенд в matplotlib / Python


87

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

Ответы:


59

Шесть лет спустя я столкнулся с аналогичной проблемой, когда пытался решить, какой из них 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")

Благодарность! Это здорово помогло мне найти подходящий
Джеймс Нельсон

Рольф из Саксонии, LOL очень полезен, я до сих пор получаю ответы на сообщения Ubuntu и Android почти десять лет назад.
Джеймс Нельсон

37

Есть «экспериментальная» функция:

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

взято из документа matplotlib .

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


Нераспознанная серверная строка «newbackend». Что я должен делать?
TSR

4
@TSR Замените newbackend на серверную часть с графическим интерфейсом, например Qt4Agg
YashTD,

14

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

import matplotlib
matplotlib.use('agg')

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

Как вы не можете перезагрузить matplotlib и matplotlib.pyplot? Или вы просто говорите, что мой фрагмент кода неполный?
fredbaba

Хм. Возможно, на самом деле это была причуда IPython. Вроде неплохо работает в обычной консоли.
Безумный физик,

1
Я думаю, что это пример, показывающий, что это не работает. python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"Верно?
Лукас

6

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

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

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

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

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


2
В самом деле, вы можете указать серверную часть в словаре rcParams, но это не решает проблему переключения с одной серверной части на другую.
DrDee

вы также можете установить бэкэнд по умолчанию в файле конфигурации, который выбирается matplotlib:~/.config/matplotlib/matplotlibrc
scrutari

4

В моем случае (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....

2

Чтобы навсегда изменить бэкэнд, вы можете использовать это:

  1. Сначала найдите matplotlibrcфайл:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. Откройте терминал и выполните:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. Отредактируйте файл (если он не существует, используйте эту команду: touch matplotlibдля его создания):

    vim matplotlibrc
    
  4. Добавьте эту строку и сохраните:

    backend: TkAgg
    

1

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


0

Если вы используете консоль IPython (в том числе в Spyder), вы можете использовать встроенные магические команды для быстрого переключения серверных модулей, например:

%matplotlib qt

Получите список доступных бэкэндов для использования с командой:

%matplotlib --list

Доступные бэкенды matplotlib: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg ',' pdf ',' ps ',' inline ',' ipympl ',' widget ']

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.