PyQt에서 차트를 위젯으로 사용하기 위해 코드입니다. 먼저 실행 결과는 다음과 같습니다.
하단에 컴보박스를 통해 2가지 항목을 선택할 수 있는데요. 항목을 선택할때마다 해당되는 항목의 그래프가 상단에 표시됩니다.
먼저 이를 위한 UI 구성을 위해 아래와 같은 코드를 작성합니다.
import sys import numpy as np from PyQt5.QtWidgets import * import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas class MyWindow(QWidget): def __init__(self): super().__init__() self.initUI() self.setLayout(self.layout) self.setGeometry(200, 200, 800, 600) def initUI(self): self.fig = plt.Figure() self.canvas = FigureCanvas(self.fig) layout = QVBoxLayout() layout.addWidget(self.canvas) cb = QComboBox() cb.addItem('Graph1') cb.addItem('Graph2') cb.activated[str].connect(self.onComboBoxChanged) layout.addWidget(cb) self.layout = layout self.onComboBoxChanged(cb.currentText()) def onComboBoxChanged(self, text): if text == 'Graph1': self.doGraph1() elif text == 'Graph2': self.doGraph2() def doGraph1(self): .... def doGraph2(self): .... if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.show() app.exec_()
Qt5에서 Matplot을 사용하기 위해서는 matplotlib.backends.backend_qt5agg 패이지의 FigureCanvasQTAgg라는 이름의 위젯 클래스가 필요하다는 것을 알 수 있습니다. MyWindow 클래스의 doGraph1과 doGraph2 함수의 코드가 핵심인데, 그 내용은 아래와 같습니다.
def doGraph1(self): x = np.arange(0, 10, 0.5) y1 = np.sin(x) y2 = np.cos(x) self.fig.clear() ax = self.fig.add_subplot(111) ax.plot(x, y1, label="sin(x)") ax.plot(x, y2, label="cos(x)", linestyle="--") ax.set_xlabel("x") ax.set_xlabel("y") ax.set_title("sin & cos") ax.legend() self.canvas.draw() def doGraph2(self): X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) Z = X**2 + Y**2 self.fig.clear() ax = self.fig.gca(projection='3d') ax.plot_wireframe(X, Y, Z, color='black') self.canvas.draw()
doGraph2 함수에 대한 실행 결과는 다음과 같습니다. 물론 이 함수의 실행은 컴보박스의 항목 중 Graph2를 선택했을때 실행됩니다.
참고로 이 글의 차트는 아래의 글을 참고로 하여 작성하였습니다.
혹시 matplotlib와 qt desinger 를 연계해서 따로 자세히 설명해줄 수 있는 강의 부탁드립니다 ㅠㅠㅠ
구글링해서 답이 나오지만 이해하기가 너무 힘드네요 ㅠㅠ
UI 디자인툴은 C#의 윈폼에서만 사용해봤고, 그외 모든 경우.. C언어를 통한 UI, 안드로이드 UI, 웹 UI 등은 디자인툴 없이 개발했던지라.. Qt5의 디자인툴을 써본적이 없답니다. 그런데, Qt5의 디자인툴이라는 것도 어떤 위젯을 어떤 배치로 할 것인지에 대한 지원이지.. 특정 하나의 위젯에 대한 처리는 코드를 통해 제어해야 하지 않을까 싶습니다.
간단하지만 좋은 예제 감사합니다.