matplotlib / Python에서 백엔드를 변경하는 방법


87

다음 문제로 어려움을 겪고 있습니다. 차트 모음으로 구성된 보고서를 생성해야합니다. 하나를 제외한 모든 차트는 Matplotlib 기본 백엔드 (TkAgg)를 사용하여 만들어집니다. 카이로 백엔드를 사용하여 차트 하나를 만들어야합니다. 그 이유는 igraph 그래프를 플로팅하고 있으며 카이로를 사용해서 만 플로팅 할 수 있기 때문입니다.

문제는 즉시 백엔드를 변경할 수 없다는 것입니다. 예를 들어 다음은 작동하지 않습니다.
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

6 년 후 나는 어떤 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/...
제임스 넬슨

Rolf of Saxony, LOL은 매우 도움이되었습니다. 저는 여전히 거의 10 년 전의 Ubuntu 및 Android 게시물에 대한 답변을 받고 있습니다.
James Nelson

37

"실험적"기능이 있습니다.

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

matplotlib doc 에서 가져 왔습니다 .

기본 백엔드를 newbackend로 전환합니다. 이 기능은 실험적 이며 이미지 백엔드로의 전환 만 작동 할 것으로 예상됩니다. 예를 들어 대화 형 ipython 세션에서 실행하려는 PostScript 스크립트가 많은 경우, GUI 창 팝업을 피하기 위해 실행하기 전에 PS 백엔드로 전환 할 수 있습니다. 한 GUI 백엔드에서 다른 GUI 백엔드로 대화식으로 전환하려고하면 폭발 할 것입니다. 이 명령을 호출하면 열려있는 모든 창이 닫힙니다.


인식 할 수없는 백엔드 문자열 'newbackend'입니다. 어떻게해야합니까?
TSR

4
@TSR 'newbackend'를 'Qt4Agg'와 같은 GUI 백엔드로 교체
YashTD

14

reload내장 함수 ( importlib.reloadPython 3)를 사용하지 않는 이유는 무엇 입니까?

import matplotlib
matplotlib.use('agg')

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

에서와 같이 matplotlib 및 matplotlib.pyplot을 다시로드 할 수 없습니까? 아니면 그냥 내 코드가 불완전하다는 말입니까?
fredbaba

흠. 실제로 IPython의 특징 일 수 있습니다. 일반 콘솔에서 잘 작동하는 것 같습니다.
Mad Physicist

1
나는 이것이 작동하지 않는다는 것을 보여주는 예라고 생각 python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"합니다. 맞습니까?
Lukas

6

그래서 이것이 당신이 찾고있는 것인지 완전히 확신하지 못합니다.

matplotlib에 대한 특정 구성이 포함 된 matplotlibrc 파일을 통해 백엔드를 변경할 수 있습니다.

스크립트에 다음을 넣을 수 있습니다.

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

또는 백엔드간에 전환 할 수 있습니다.


2
실제로 rcParams 사전에 백엔드를 지정할 수 있지만 이것이 한 백엔드에서 다른 백엔드로 전환하는 문제를 해결하지는 못합니다.
DrDee 2010

matplotlib에 의해 선택되는 구성 파일에서 기본 백엔드를 설정할 수도 있습니다.~/.config/matplotlib/matplotlibrc
scrutari

4

제 경우 (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....

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

아마도 pickle 또는 joblib 의 도움으로 다른 Python 프로세스가 해당 플롯을 만들 수 있습니다 .


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 ']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.