본문 바로가기
Python/Matplotlib

Matplotlib의 backend(백엔드) - matplotlib(3)

by 콩돌 2019. 4. 1.
반응형

파이썬 버전 3.7 기준

matplotlib 버전 3.0.3 기준



  Matplotlib에서의 backend(백엔드)


본 포스팅에서는 Matplotlib에서 사용될 수 있는 backend에 대해 다룬다.



  Backend란? 


웹사이트와 메일링 리스트의 많은 자료에서는 "backend"를 참조하며, 새로운 사용자들은 이 용어에 대해 혼란을 일으킨다.

따라서 본 포스팅에서는 백엔드에 대해 설명을 해보도록 한다.


먼저 matplotlib에서 백엔드는 그래프를 다양한 방식으로 출력하기 위해 겉으로는 보이지 않게 지원해주는 시스템을 말한다.


공식적인 방법으로 maltplotlib를 설치할 경우(예를들어 바이너리 인스톨러나 리눅스배포패키지로부터 설치할 경우) 이미 괜찮은 기본 backend가 셋팅되어 있다. 

이는 파일 혹은 화면으로의 출력을 사용하여 대화형 형태와 스크립트로부터의 플롯팅 둘 다 가능하게 한다. 

그리고 최소한 초기에 사용자는 위에 언급한 방법으로 사용하지 않아도 된다. 

그러나 만약 사용자가 그래픽 유저 인터페이스 혹은 웹어플리케이션 서버를 작성하길 원하거나 혹은 진행사항에 대해 더 나은 이해가 필요한 경우 아래 내용을 더 읽어볼 것을 추천한다. 


  Matplot의 사용 방식

먼저 Matmplotlib를 사용하는 방식이 사람 혹은 프로젝트마다 다른데 정리하면 아래와 같다.

  ○ matplotlib를 파이썬 쉘을 통해 대화식으로 사용하는 형태로, 커맨드를 칠때 윈도우 팝업플롯팅을 뜨도록 한다.

  ○ Jupyter notebook을 실행하며, 빠른 데이터 분석을 위해 인라인 플롯을 그린다. 

  ○ wxpython, pygtk와 같이 matplotlib를 다른 그래픽 유저인터페이스에 끼워넣기도 한다.

  ○ matplotlib를  batch 스크립트에서 수치시뮬레이션으로부터 postscript image를 만들기 위해 사용한다.

  ○ 웹 어플리케이션 서버를 운영하는데 동적으로 그래프를 보여주는데 사용한다.


모든 사용방식을 지원하기 위해 matplotlib는 출력을 다르게 하는 것을 목표로 하며, 각각의 기능을 백엔드라 부른다.  

frontend(프론트엔드)는 유저가 직접 작성하는 코드, 즉 플롯팅 코드이다. 반면 백엔드는 figure를 작성하기 위해 상당히 어려운 작업들을 뒷받침 한다. 


  Backend(백엔드)의 종류

크게보면 두 가지 타입의 백엔드가 존재한다.

  ○ 사용자 인터페이스 백엔드

    - pygtk, wxpython, tkinter, qt4, macosx 외에 대화형 백엔드

  ○ 이미지 파일을 만들기 위한 하드카피 백엔드 

    - PNG, SVG, PDF, PS 외에 비대화형 백엔드



  Backend(백엔드)의 환경설정

사용자의 백엔드의 환경설정을 하기 위한 방법이 몇 가지가 있다. 

만약 각각 충돌을 한다면, 마지막에 언급된 ③방법을 사용하면 된다.

use()를 불러오는 것은 사용자의 matplotlibrc에서 수행한 세팅 위에 덮어씌어질 수 있다. 


① matplotlibrc 파일 내부에서의 backend 파라미터의 수정

backend : WXAgg   # use wxpython with antigrain (agg) rendering


② 유닉스 상에서, 하나의 스크립트 혹은 하나의 쉘에 대한 MPLBACKEND 환경변수의 설정 

> export MPLBACKEND=module://my_backend

> python simple_plot.py


> MPLBACKEND="module://my_backend" python simple_plot.py


  윈도우에서는 아래와 같은 형식도 가능하다. 

> set MPLBACKEND=module://my_backend

> python simple_plot.py


matplotlibrc가 워킹디렉토리에 존재한다 하더라도, 이 환경변수를 세팅할 경우 어떠한 matplotlibrc 안의 backend 파라미터를 덮어쓰게된다. 따라서 .bashrc 혹은 .profile에 MPBACKEND를 전역으로 셋팅하는 것은 주천되지 않는다. 이것은 직관적인 행동과는 거리가 멀다. 


③ 만약 사용자의 스크립트가 명확한 backend에 의존한다면, use()를 사용할 수 있다.

import matplotlib

matplotlib.use('PS')   # generate postscript output by default

  

만약 사용자가 use() 함수를 사용한다면, matplotlib.pyplot을 import하기 전에 위의 코드가 수행되어져야 한다. 

pyplot을 먼저 불러오고 use()함수를 불러오는 것은 아무런 효과를 볼 수없다. 만약 사용자가 다른 backend를 사용하는 것을 원한다면, use()함수를 사용하는 것은 사용자의 코드에서 변경을 요구한다. 그러므로 사용자는 필요한 경우가 아니라면 use()를 불러오는 것을 피해야만 한다. 


참고사항 
  Backend의 이름 지정은 대소문자를 구분하지 않는다. 즉, GTK3Agg와 gtk3agg는 같다.


  Backend의 종류


그래픽 유저 인터페이스를 여러 방식으로 꾸미기 위해, matplotlib은 렌더(실제로 그림이 그려지는 곳)의 컨셉을 캔버스(그림이 위치하는 곳)로부터 분리한다. 

유저 인터페이스를 공식적으로 랜더링을 수행해주는 툴은 Agg이며 이것은 figure의 레스터(픽셀) 이미지를 만들기 위해 Anti-Grain Geometry C++ 라이브러리를 사용한다. 

macosx를 제외한 모든 유저 인터페이스들은 agg 랜더링을 기반으로 사용되어진다(WXAgg, GTK3Agg, QT4Agg, QT5Agg, TkAgg). 

추가적으로 몇몇의 유저인터페이스는 다른 랜더링 엔진을 지원한다. 예를들어, GTK+3을 사용하여 사용자는 Cairo 랜더링을 사용할 수 있다(backend GTK3Cairo).


랜더링 엔진을 기준으로 랜더러의 종류를 vector(벡터) 혹은 raster(레스터) 랜더러로 나눌 수 있다. 

  ○ 벡터 그래픽 언어는 드로잉 커맨드를 이용한다(이 점과 저점 사이에 선을 그려라 같은).그리고 스케일은 자유롭다. 

  ○ 레스터 백엔드는 라인의 픽셀 표현을 만들어내며 DPI 세팅에 의해 정확도가 조정된다. 


  Matplotlib의 Render

아래 표는 matplotlib의 랜더러의 요약본을 보여준다.

 Renderer 

 Filetypes 

Description 

 AGG

 png 

 raster graphics, high quality images using the Anti-Grain Geometry engine

 PS

 ps eps

 vector graphics, Postscript output

 PDF

 pdf

 vector graphics, Portable Document Format

 SVG

 svg

 vector graphics, Scalable Vector Graphics

 Cairo

 png ps pdf svg

 raster graphics and vector graphics, using the Cairo graphics library


  Matplotlib의 Backend

그리고 아래 표는 유저 인터페이스와 랜더러 둘 다 지원되는 백엔드를 보여준다.

대화형 백엔드들이며 스크린에 디스플레이를 띄울 수 있고, 파일을 출력하기 위해 위 테이블에 있는 적당한 렌더러를 사용할 수 있다. 


 Backend

 설명 

 Qt5Agg

 - Qt5 캔버스에 있는 Agg rendering (PyQt5를 필요로 한다.)

 - 이 백엔드는 IPython에서 "%matplotlib qt5"에 의해 활성화될 수 있다.

 ipympl

 - Jupyter 위젯에 내장된 Agg rendering (ipympl를 필요로 한다.)

 - 이 백엔드는 Jupyter notebook에서 "%matplotlib ipympl"에 의해 활성화될 수 있다.

 GTK3Agg

 - GKT 3.x 캔버스로의 Agg rendering (PyGObject와 pycairo 혹은 cairocffi를 필요로 한다.)

 - 이 백엔드는 IPython에서 "%matplotlib gtk3"에 의해 활성화될 수 있다.

 macosx

 - OSX에서 Cocoa 캔버스로의 Agg rendering

 - 이 백엔드는 IPython에서 "%matplotlib osx"에 의해 활성화될 수 있다.

 TkAgg

 - Tk 캔버스로의 Agg rendering

 - 이 백엔드는 IPython에서 "%matplotlib tk"에 의해 활성화될 수 있다.

 nbAgg

 - Jupyter classic notebook에서의 내장 대화형 figure

 - 이 백엔드는 Jupyter notebook에서 "%matplotlib ipympl"에 이용될 수 있다.

 WebAgg

 - Show()를 키면 tornado 서버가 시작되며 대화형 figure를 사용하게된다.

 GTK3Cairo

 - GKT 3.x 캔버스로의 Agg rendering (PyGObject와 pycairo 혹은 cairocffi를 필요로 한다.)

 Qt4Agg

 - Qt4 캔버스에 있는 Agg rendering (PyQt4를 필요로 한다.)

 - 이 백엔드는 IPython에서 "%matplotlib qt4"에 의해 활성화될 수 있다.

 WXAgg

 - wxWidgets 캔버스로의 Agg rendering (wxPython 4를 필요로 한다.)

 - 이 백엔드는 IPython에서 "%matplotlib wx"에 의해 활성화될 수 있다.



  Jupyter의 백엔드인 ipympl

Jupyter 위젯 에코시스템은 너무 빠르게 움직여서 Matplotlib에서 직접적으로 지원할 수 없다. 

ipympl를 인스톨하기 위해서는 아래와 같은 명령어를 사용하면된다.


pip install ipympl

jupyter nbextension enable --py --sys-prefix ipympl

혹은

conda install ipympl -c conda-forge



  GTK와 Cairo

GTK3 백엔드는 (GTK3Agg와 GTK3Cairo 둘 다) Cairo에 의존한다. (pycairo>=1.11.0 혹은 cairocffi)


  PyQt4 혹은 PySide 중 어떤걸 선택할까?

QT_API 환경변수는 PyQt4 혹은 PySide 사용해서 pyqt, pyside 둘 다 셋팅이 가능하다. 


기본값은 PyQt4이기 때문에, matplotlib는 PyQt4를 불러오는 것을 먼저 시도한다.

만약 PyQt4를 불러오는 것에 실패할 경우, PySide를 불러오는 것을 시도한다.



 

 

 

 

 참고자료

  https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py 

 

 

 

 



반응형

댓글