본문 바로가기
IT/Python

PyQt5로 파이썬 GUI 만들기 / python GUI (5) 그래프 그리기, 저장하기

by 르미르미 2020. 3. 28.

가장 어려웠던 부분이다.

matplotlib 을 이용하여 그래프를 그리고 

plt.show() 등을 이용하면 내가 만든 GUI 창이 아니고 추가적인 창에 그래프가 그려진다.

 

나는 GUI 안에서 그래프를 보고 싶은데!! 

그래프를 넣고 싶은 부분에 widget를 그려준다. 

objectName 은 graph_viewer 로 지정하기로 한다. (하고 싶은 이름 하면 된다.) 

그 다음 위젯에서 오른쪽 클릭을 하여 

다음으로 승격을 눌러준다. 

그러면 아래와 같은 창을 만날 수 있다. 

그 다음 승격된 클래스 이름과 헤대 파일을 위와 같이 입력해 준다. 

 

from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class matplotlibWidget(QWidget):

    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.canvas = FigureCanvas(Figure())
        vertical_layout=QVBoxLayout()
        vertical_layout.addWidget(self.canvas)
        vertical_layout.setContentsMargins(1, 1, 1, 1)
        self.canvas.axes=self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)

 그 다음 위와 같이 코드를 입력하고 matplotlibwidgetFile.py 로 저장!! 

 

 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5 import QtCore, QtGui, QtWidgets


from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


form_class = uic.loadUiType("~~~~.ui")[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def show_graph(self):
    	#x_list, y_list, y_err, data_name에 대한 설정 코드 
    	self.graph_viewer.canvas.axes.errorbar(x_list, y_list, yerr=y_err, label=data_name)
        self.graph_viewer.canvas.axes.legend()
        self.graph_viewer.canvas.axes.set_xlabel('~~~')
        self.graph_viewer.canvas.axes.set_ylabel('~~~')
        self.graph_viewer.canvas.draw() 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()      

그 다음 main py 파일을 위와 같이 입력하면 완성~~

위의 파일은 errorbar라는 그래프를 그리는 내용이다. plot 등으로 바꾸면 된다. 

.ui파일을 불러오고 def 로 함수를 설정해서 그래프를 그릴 수 있다. 

정말~~ 어려웠다~~ 

 

 

    def save(self):
        pix=self.graph_viewer.grab()
        filename=QFileDialog.getSaveFileName(self)[0]
        pix.save(filename)

 

추가적으로 위와 같이 설정하면 그래프 저장도 할 수 있다!!! 

저장 버튼을 만들고 슬롯 설정해서 save()를 만들었다. 

그 다음 save()에 대한 코드 입력. 

 

그냥 save만 이용하면 

ex) pix.save("Graph") 

py 파일이 있는 그 위치에 "Graph"라는 이름으로 저장이 된다. 

 

하지만 QFileDialog.getSaveFileName()을 이용하면 내가 원하는 위치에 원하는 이름으로 저장할 수 있다. 

주의할 점은!! 마지막에 확장자까지 적어줘야 한다는 점!! 

만약에 확장자를 매번 적기 귀찮고 하나의 확장자로 통일하려고 한다면 

pix.save(filename+'.png') 처럼 확장자를 포함하는 내용을 추가해주면 된다. 

 

graph_viewer 대신 다른 위젯 objectName을 넣으면 그 위젯만 이미지파일로 지정할 수 있음. 

윈도우 전체를 캡쳐할 수 도 있다. 

 

아 할 때는 정말 힘들었는데 정리하니까 쉽네. 

역시 초보자는 힘들다. 

 

 

댓글