개요
wxPython 프로그램을 만들면서 Matplotlib으로 차트를 그려 띄우는 기능이 필요할 때가 있다. JupyterNotebook에서는 별도의 코드 없이 plt.show()로 데이터를 플롯하여 차트까지 띄우는게 가능하지만 wxPython에서는 별도의 캔버스 인스턴스를 만들어 차트를 띄울 수 있다. 파이썬으로 간단히 만든 차트를 GUI에 띄워보자!
FigureCanvasWxAgg
FigureCanvasWxAgg(matplotlib.backends.backend_wxagg.FigureCanvasWxAgg - 이하 FigureCanvas)는 간단히 말에 Matplotlib의 Figure를 담는 그릇이라고 생각하면 된다. 그리고 추가적으로 Figure에 관련된 이벤트 핸들링 기능도 담당한다. FigureCanvas 클래스는 아래와 같이 matplotlib 패키지 안에 backend 처리를 다루는 모듈에 정의되어 있다.
class matplotlib.backends.backend_wxagg.FigureCanvasWxAgg(parent, id, figure)
FigureCanvas도 wxPython에서 사용할 용도로 만든 패널(wx.Panel)의 일종이기 때문에 패널 선언시와 유사하게 parent와 id를 인자로 갖고, 추가적으로 figure도 인자에 포함된다. size의 경우, figure의 size를 따라가기 때문에 별도로 지정하지는 않는다. (fig.set_size_inches(x,y))
NavigationToolbar2WxAgg
FigureCanvas만 곧바로 Sizer에 담아서 보여줄수도 있으나, 경우에 따라서는 사용자의 그래프 사이즈 조절, 혹은 이미지로 저장 등이 필요하기 때문에 이에 대한 툴바를 별도로 만들어주는것도 괜찮다. 이를 담당하는 별도의 툴바를 NavigationToolbar(matplotlib.backends.backend_wxagg.NavigationToolbar2WxAgg)라고 하며 선언은 아래와 같다.
toolbar = NavigationToolbar2Wx(figurecanvas, style=wx.TB_TEXT|wx.TB_NODIVIDER)
인수는 figurecanvas와 style을 갖고, style의 경우 wx.ToolBar 속성값(TB_TEXT, TB_VERTICAL 등.. https://docs.wxpython.org/wx.ToolBar.html#styles-window-styles)을 그대로 쓸 수 있다.
예제
예제는 x,y 난수를 10개씩 생성해서 플로팅하는 예제이다.
import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar2Wx
import matplotlib.pyplot as plt
import numpy as np
class Example(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self,parent,id,'Example Window', size=(-1,-1))
panel = wx.Panel(self, -1)
panel.SetBackgroundColour(wx.WHITE)
# Scatter Plot 생성
# 난수 배열 생성
x = np.random.randint(low=0, high=10, size=(10,))
y = np.random.randint(low=0, high=10, size=(10,))
# 플롯
plt.plot(x, y)
# 위에서 생성된 Figure와 Ax 객체 확인
fig, ax = plt.gcf(), plt.gca()
# figure size 확인
# Figure Size in Pixels : (inch size) * (dot per inch) = (inch size x, y) * (dots/inch) = (x_dots, y_dots) -> 픽셀사이즈
fsize_x, fsize_y = fig.get_size_inches()*fig.dpi
# 그래프를 그리기 위한 FigureCanvas 생성
canvas = FigureCanvas(panel, -1, fig)
# 그래프의 네비게이션 툴 바 생성
toolbar = NavigationToolbar2Wx(canvas, style=wx.TB_TEXT|wx.TB_NODIVIDER)
toolbar.Realize()
toolbar.SetBackgroundColour(wx.WHITE)
# 박스사이저 할당
sizer = wx.BoxSizer(wx.VERTICAL)
# 박스사이저에 캔버스와 툴바를 각각 넣는다.
sizer.Add(toolbar, 0, wx.ALIGN_CENTER|wx.TOP, 20)
sizer.Add(canvas, 0)
# 패널에 사이저 할당
panel.SetSizerAndFit(sizer)
# 프레임 사이즈 재조정
self.SetSize((int(fsize_x), int(fsize_y+toolbar.GetSize()[-1]+60)))
if __name__=="__main__":
app = wx.App()
frame=Example(parent=None, id=-1)
frame.Show()
app.MainLoop()
도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :)
'wxPython' 카테고리의 다른 글
파이썬 GUI, 글자 해상도 선명하게 바꾸기, 해상도, DPI 조절 (0) | 2023.05.26 |
---|---|
파이썬 GUI, 공지메시지 Notification Message (0) | 2023.05.26 |
파이썬 GUI, 로딩시 로고화면 넣기, 스플래시 스크린 Advanced Splash (0) | 2023.04.30 |
파이썬 GUI, Aui툴바 AuiToolBar (0) | 2023.04.29 |
파이썬 GUI, 툴바 wx.ToolBar (0) | 2023.04.22 |