Як змінити бекенди в matplotlib / Python


87

Я борюся з наступною проблемою. Мені потрібно створити звіти, які складаються з колекції діаграм. Всі ці діаграми, за винятком однієї, зроблені з використанням беккенда за замовчуванням Matplotlib (TkAgg). Одну діаграму потрібно зробити за допомогою каїрської серверної бази, причина полягає в тому, що я складаю графік графіку, і це може бути побудовано лише за допомогою Каїру.

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

і я також пробував, 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 ...., будь ласка, опублікуйте свою відповідь.


Існує 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

Для тих, хто все ще відчуває проблеми, цей код роздрукує:
список бекендів Non 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")

Дякую! Це чудово допомогло мені допомогти знайти відповідний бек-енд для цього прикладу: stackoverflow.com/questions/11874767/…
— Джеймс Нельсон,

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

37

Існує "експериментальна" особливість:

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

взято з matplotlib doc .

Переключіть бекенд за замовчуванням на новий сервер. Ця функція є експериментальною і, як очікується, буде працювати лише при переході на серверну картинку. Наприклад, якщо у вас є купа сценаріїв 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

Ви також можете встановити ~/.config/matplotlib/matplotlibrc
— бэкенд

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
    


0

Якщо ви використовуєте консоль IPython (у тому числі в Spyder), ви можете використовувати вбудовані магічні команди для швидкого переключення бекендів, наприклад:

%matplotlib qt

Отримайте список доступних серверних систем для використання з командою:

%matplotlib --list

Доступні bacplond matplotlib: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg ',' pdf ',' ps ',' вбудований ',' ipympl ',' віджет ']

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.