developer tip

matplotlib / Python에서 백엔드를 전환하는 방법

copycodes 2020. 11. 18. 09:17
반응형

matplotlib / Python에서 백엔드를 전환하는 방법


다음 문제로 어려움을 겪고 있습니다. 차트 모음으로 구성된 보고서를 생성해야합니다. 하나를 제외한 모든 차트는 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 백엔드를 동적으로 전환하는 방법을 아는 사람은 누구나 답변을 게시하십시오.


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")

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

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

matplotlib doc 에서 가져 왔습니다 .

Switch the default backend to newbackend. This feature is experimental, and is only expected to work switching to an image backend. Eg, if you have a bunch of PostScript scripts that you want to run from an interactive ipython session, you may want to switch to the PS backend before running them to avoid having a bunch of GUI windows popup. If you try to interactively switch from one GUI backend to another, you will explode. Calling this command will close all open windows.


Why not just use the reload built-in function (importlib.reload in Python 3)?

import matplotlib
matplotlib.use('agg')

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

So I am not completely sure if this is what you are looking for.

You can change your backend through the matplotlibrc file which contains certain configurations for your matplotlib.

In your script you can put:

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

or something like that to switch between backends.


You could also have a different Python process make that plot, possibly with the help of pickle or joblib.


In my case (Windows 10 + python 3.7), the first answer by @Rolf of Saxony didn't work very well. Instead of trying all the available environments and configuring one of them at the beginning, i.e, just after

    import matplotlib

I had to change the environment from 'Agg' to 'TkAgg' using

    matplotlib.use('TKAgg',warn=False, force=True)

right before the code where I actually plotted, i.e,

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

To permanently change the backend you can use this:

  1. First locate the matplotlibrc file:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. Open the terminal and do:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. Edit the file (if it does not exist use this command: touch matplotlib to create it):

    vim matplotlibrc
    
  4. Add this line and save:

    backend: TkAgg
    

참고URL : https://stackoverflow.com/questions/3285193/how-to-switch-backends-in-matplotlib-python

반응형