matplotlib: backend란
matplotlib의 backend 관련자료를 정리한 문서임.
Matplotlib Architecture
Matplotlib 아키텍트는 다음과 같이 크게 3가지 레이어로 구성된다.
- Backend Layer :
- 상위 layer에서 graph를 생성하는데 초점을 두는 것과 달리,
- 생성된 graph를 실제 시스템에서 어떻게 보여줄지(또는 저장할지)를 처리함.
- Artist Layer :
- OOP 를 통해 customization을 수행할 수 있음.
- Scripting Layer :
- scripting을 통해 실제 graph를 그리는 부분.
What is a backend?
Matplotlib는 다양한 환경에서 graph를 표시하고, 다양한 출력 format으로 저장할 수 있음.
일반적으로 matplotlib를 사용하는 경우들을 크게 다음으로 나눌 수 있음.
- Python shell에서 commnad를 입력하여 matplotlib의 graph를 interactive하게 그리는 경우.
- Python shell에서 graph가 그려지는 windows가 띄우게 되며,
- command와 해당 windows의 버튼들을 통해 graph와 상호작용이 가능함.
- Jupyter notebooks에서 데이터 분석을 위해 inline plots 을 matplotlib로 그리고 확인하는 경우.
- PyQt or PyGObject를 통해 만들어지는 GUI application에서 graph등을 그리기 위해 matplotlib를 내장시키는 경우.
- 수치해석 분석이나 시뮬레이션 등에서 png, svg등의 postscript image를 생성시키는 batch script로 사용하는 경우.
- django나 flask등으로 구현되는 web application server에서 graph를 그리는 기능을 제공하기 위해서 matplotlib를 도입하는 경우.
위와 같이 다양한 경우들과 다양한 output format을 지원하기 위해 Matplotlib는 각각의 경우에 대한 backend를 제공함.
backend는
artist layer나 scripting layer등에서 생성한 graph에 대해
실제 시스템 환경에서 display시키기 위해 필요한 처리 또는
output format으로 encoding하기 위해 필요한 처리를 담당함.
- 위의 다양한 경우를 위해 사용자가 graph등을 만들기 위해 작성하는 coding (artist layer 및 scripting layer에서 coding)은 동일하지만,
- 해당 code를 통해 실제 graph를 1)디스플레이 하거나 2)파일로 저장 하는 등의 여러 경우의 처리는 각 경우마다 다름.
- 이를 backend가 알아서 해준다.
- 이를 matplotlib 용어로 애기하면, 일관된 frontend interface는 유지하면서 다양한 환경 및 출력포맷을 제공하기 위해 backend를 도입한 것임.
matplotlib의 backend는 다음과 같이 크게 2가지로 나뉨
- user interface backend (PyQt/PySide, PyGObject, Tkinter, wxPython, or macOS/Cocoa등을 사용)
- interactive가 가능한 backend.
- hardcopy backend (PNG, SVG, PDF, PS)
- image file을 생성. "non-interactive backends"라고도 불림.
- static backend라고도 불림.
Selecting a backend
다음 3가지 방법으로 matplotlib의 backend를 설정할 수 있음.
- The rcParams["backend"] parameter in your
matplotlibrc
file - The MPLBACKEND environment variable
- The function matplotlib.use( )
위 3가지 방법에서 동일한 항목에 대한 설정이 다르게 존재하는 경우,
리스트에서 마지막 것이 우선권을 가짐(python의 변수 할당과 비슷).
예를 들어 설명하면,matplotlib.use()
는 앞서 두 방식의 설정치를 override함.
참고로 matplotlibrc
파일의 경로는 다음과 같은 방식으로 확인 가능함.
import matplotlib
print(matplotlib.matplotlib_fname())
- 보통 가상환경 등의
site-packages/matplotlib/mpl-data/matplotlibrc
에 위치.
명시적으로 backend를 지정을 하지 않은 경우엔 matplotlib가 자동으로 사용가능한 backend를 찾아서 사용함.
가장 많이 사용되는 backend list는 다음과 같음.
MacOSX
QtAgg
***GTK4Agg
**Gtk3Agg
TkAgg
WxAgg
Agg
**
맨 마지막의 Agg
backend는
non-interactive backend로
linux에서 X window 설정 등이 되지 않은 headless 장비에서 주로 사용된다
(file로만 저장시킴. 아래에 좀 더 자세히 다룸).
1.matplotlibrc
file의 rcParams["backend"]
parameter로 설정하기. : 관련url
backend : qtagg # use pyqt with antigrain (agg) rendering
2.MPLBACKEND 환경변수로 설정하기
# Linux
> export MPLBACKEND=qtagg
> python simple_plot.py
# Windows
> set MPLBACKEND=qtagg
> python simple_plot.py
3.matplotlib.use() 로 설정하기.
import matplotlib
matplotlib.use('qtagg')
The "builtin
" backends
일반적으로는 Matplotlib가 알아서 기본 backend를 설정하지만,
GUI toolkit이 전혀 없는 일부 특수한 linux의 경우엔 python-tk
패키지를 설치해야 함.
사실 backend는 거의 다 알아서 처리해주기 때문에
단순히 jupyter notebook등에서 이용하는 경우라면, backend에 대해 그리 신경쓸 필요가 없다.
하지만 GUI application이나 Web application server등에서 matplotlib를 사용할 때에는 좀더 많은 backend에 대한 이해가 필요.
GUI등에서 효율적 활용을 위해
Matplotlib는
- 실제 drawing이 이루어지는 canvas 와
- 실제 drawing을 수행하는 renderer를 분리하였다.
일반적으로 user interface를 위한 표준(canonical) renderer는 Agg
임.
Agg
는 Anti-Grain Geometry C++ 라이브러리를 사용하여 figure로 raster(pixel) image를 생성함.Agg
는QtAgg
,GTK4Agg
,GTK3Agg
,wxAgg
,TkAgg
, andmacosx
backends에서 사용된다.Agg
의 대안으로는Cairo
library에 기반을 둔 render가 있으며, 이는QtCairo
등의 backend 에서 사용됨.
2024.04.29 - [Python/matplotlib] - [Etc] Anti-Grain Geometry (AGG)
참고로, renderer (or rendering engine)는 vector graphics renderer와 raster graphics renderer로 나뉨.
- renderer들은 각각이 동일한 이름의 non-interactive backend (or static backend)를 가진다.
- 즉, renderer만 있으면 image file로 저장은 가능함.
Matplotlib에선 지원하는 static renderer는 다음과 같음.
Renderer | Filetypes | Description |
AGG ** | png | raster graphics — high quality images using the Anti-Grain Geometry engine. |
vector graphics — Portable Document Format output. | ||
PS | ps, eps | vector graphics — PostScript output. |
SVG | svg | vector graphics — Scalabel Vector Graphics output. |
PGF | pgf, pdf | vector graphics — using the pdf package. |
Cairo | png, ps, pdf, svg | raster or vector graphics — using the Cairo library (requires pycairo or cairocffi ). |
non-interactive backends (or static renderer)를 사용하여 graph를 image file로 저장하는 경우matplotlib.pyplot.savefig('filename')
메서드를 사용한다.
Interactive backends
interactive backends는 user interface와 renderer의 combination이다.
참고로, Matplotlib가 최초로 지원한 intreactive backends는 GTK기반이었기 때문에, 많은 API가 GTK API와 유사함.
https://matplotlib.org/stable/users/explain/figure/event_handling.html#event-handling-and-picking
Matplotlib에선 지원하는 interactive backends는 다음과 같음.
Backend | Description |
QtAgg | Agg rendering in a QT canvas (requires PyQt or Qt for Python, a.k.a. PySide). This backend can be activated in IPython with %matplotlib qt .The Qt binding can be selected via the QT_API environment variable; see Qt Bindings for more details |
ipympl | Agg rendering embedded in a Jupyter widget (requires ipympl). This backend can be enabled in a Jupyter notebook with %matplotlib ipympl . |
GTK3Agg | Agg rendering to a GTK 3.x canvas (requires PyGObject and pycairo). This backend can be activated in IPython with %matplotlib gtk3 . |
GTK4Agg | Agg rendering to a GTK 4.x canvas requires PyGObject and pycairo). This backend can be activated in IPython with %matplotlib gtk4 . |
macosx | Agg rendering into a Cocoa canvas in OSX. This backend can be activated in IPython with %matplotlib osx . |
TkAgg | Agg rendering to a Tk canvas (requires TkInter). This backend can be activated in IPython with %matplotlib tk . |
nbAgg | Embed an interactive figure in a Jupyter classic notebook. This backend can be enabled in Jupyter notebooks via %matplotlib notebook . |
WebAgg | On show() will start a tornado server with an interactive figure. |
GTK3Cairo | Cairo rendering to a GTK 3.x canvas (requires PyGObject and pycairo). |
GTK4Cairo | Cairo rendering to a GTK 4.x canvas (requires PyGObject and pycairo). |
wxAgg | Agg rendering to a wxWidgets canvas (requires wxPython 4). This backend can be activated in IPython with %matplotlib wx . |
builtin backend의 경우, 이름을 지정할 때 case-insensitive임.
즉 QtAgg
and qtagg
are equivalent.
다음 코드를 수행할 경우, 현재 사용가능한 matplotlib의 interactive backend를 확인할 수 있음.
#!/usr/bin/env python
import matplotlib.pyplot as plt
import matplotlib
backends = matplotlib.rcsetup.interactive_bk
# validate backends
backends_valid = []
for b in backends:
try:
plt.switch_backend(b)
backends_valid += [b]
except:
continue
print(f'{backends_valid = }')
참고: ipyml
Jupyter widget ecosystem 은 워낙 빨리 변화하기 때문에 matplotlib에서 직접 지원하기 어려움.
때문에 ipympl
은 다음의 명령어로 설치하여 사용해야함.
conda install ipympl -c conda-forge
or
pip install ipympl
Using "non-builtin" backends
위에서 설명한 방법으로 non-builting backend도 사용하도록 지정가능함.
단, 해당 backend가 matplotlig에서 import 가능하도록 구현이 되어야 함.
backend 구현에 대한 보다 자세한 내용은 다음 URL을 참고할 것 : Writing a backend -- the pyplot interface.
backend를 포함하는 module이 name.of.the.backend
라면
backend 이름으로 module://name.of.the.backend
를 사용할 것.
예를 들면 matplotlib.use('module://name.of.the.backend')
와 같은 형태임.
References
https://matplotlib.org/stable/users/explain/backends.html#interactive-backends
https://kongdols-room.tistory.com/78
'Python > matplotlib' 카테고리의 다른 글
[matplotlib] x축과 y축을 그리기: spines (0) | 2023.08.08 |
---|---|
[matplotlib] line 및 marker 설정하기. (0) | 2023.07.21 |
[matplotlib]: Figure and Axes (0) | 2023.07.20 |
[Python] matplotlib : Axis Scale and Ticks (0) | 2023.07.14 |
[matplotlib] : Styling Artists and Labeling Plots (0) | 2023.07.14 |