Як змінити бекенди в 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.