Как переключать бэкэнды в matplotlib / Python - PullRequest
64 голосов
/ 20 июля 2010

Я борюсь со следующей проблемой. Мне нужно создавать отчеты, которые состоят из коллекции графиков. Все эти диаграммы, кроме одной, сделаны с использованием стандартного бэкэнда Matplotlib (TkAgg). Один график должен быть сделан с использованием бэкэнда Cairo, причина в том, что я строю график igraph, и его можно построить только с помощью Cairo.

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

и я также попытался matplotlib.use("cairo.png"), но это приводит к проблемам с импортом, так как оператор matplotlib.use("cairo.png") должен предшествовать импорту matplotlib.pyplot. но мне нужны два разных бэкэнда на протяжении всей жизни сценария.

Итак, у меня вопрос: есть ли у кого-нибудь фрагмент кода, показывающий, как переключить бэкэнд в Matplotlib?

Большое спасибо!

UPDATE: Я написал фрагмент, который загружает 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 ..., пожалуйста, оставьте свой ответ

Ответы [ 6 ]

43 голосов
/ 25 марта 2017

Шесть лет спустя, и я столкнулся с похожей проблемой, пытаясь решить, какой 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")
34 голосов
/ 16 июня 2011

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

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

взято из matplotlib doc .

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

13 голосов
/ 08 февраля 2013

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

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
3 голосов
/ 20 июля 2010

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

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

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

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

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

1 голос
/ 07 июня 2011

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

0 голосов
/ 03 июня 2019

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