본문 바로가기

카테고리 없음

Pyside6 를 이용한 등고선 그리기

 

1. Pyside6 를 이용한 등고선 그리기

프로젝트를 진행하다보면 등고선을 그려야 하는 업무가 찾아올수가 있습니다.

가령 특정 독성이 있는 기체가 특정지점에서 얼마만큼의 거리에서 독성이  어느정도 낮아진다 라는 자료를 요구할때가 있죠.

 

2. 목표설정

오늘은 그런 업무에 대응할수 있는 결과물을 Pyside6로 프로그래밍 해볼 예정입니다.

 

먼저 목표를 정하도록 하겠습니다.

중앙을 기준으로 1m 마다 독성 계측을 하는 총 10m 범위의 등고선을 만든다고 가정하겠습니다.

 

그럼 중심을 기준으로 양쪽으로 5m를 만들어야 겠군요.

그리고 중심을 기준으로 다시 아래위로 5m를 만들어 줘야 합니다.

 

그럼 프로그램을 시작하도록 하겠습니다.

 

먼저 가장 중요한건 GUI를 어떻게 구성하느냐 입니다.

우리의 목표는 아래의 그림과 같은 등고선을 구현하는것입니다.

등고선 입력의 형태는 아래 그림과 같이 구성하여 진행할것입니다.

 

프로그램 설계는 완성하였습니다.

 

3. 프로그램 순서

 

그럼 이제 코딩을 시작하도록 합니다.

위와 같은 형식의 Layout을 구성합니다.

먼저 입력단 Data Table 을 만듭니다.

 

다음은 버튼을 만들도록 합니다. 

다음은 그래프를 만듭니다.

다음은 버튼 이벤트가 발생했을때 실행되는 함수 이벤트를 연결합니다.

 

 

마지막으로 테이블을 화면에 표현합니다.

자 지금까지 초기화를 했습니다.

이제 동작 함수를 구현해 실제 동작하도록 구성해야 합니다.

 

3. 함수구현

 

입력단 데이터 테이블을 실제로 구현합니다.

 

등고선 생성시 데이터 테이블의 값을 읽어오는 기능을 구현합니다.

등고선 생성 함수를 구현합니다.

 

메인함수 입니다.

간략하게 중요한 내용 위주로 설명했고 전체 코드는 아래와 같습니다.

 

4. 전체 프로그램 코드

import sys
import numpy as np
import matplotlib.pyplot as plt
from PySide6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, QHBoxLayout, QLabel, QFileDialog
)
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas

class ContourPlotApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("10x10 숫자 입력 등고선 그래프")
        self.setGeometry(100, 100, 800, 600)
        
        # 레이아웃 설정
        layout = QVBoxLayout()
        self.table = QTableWidget(10, 10)
        self.table.setAlternatingRowColors(True)
        layout.addWidget(self.table)
        
        # 버튼 레이아웃
        button_layout = QHBoxLayout()
        self.plot_button = QPushButton("등고선 생성")
        self.clear_button = QPushButton("초기화")
        self.save_button = QPushButton("이미지 저장")
        
        button_layout.addWidget(self.plot_button)
        button_layout.addWidget(self.clear_button)
        button_layout.addWidget(self.save_button)
        layout.addLayout(button_layout)
        
        # 그래프 표시 레이블
        self.graph_label = QLabel()
        self.graph_label.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.graph_label)
        
        self.setLayout(layout)
        
        # 버튼 이벤트 연결
        self.plot_button.clicked.connect(self.plot_contour)
        self.clear_button.clicked.connect(self.clear_table)
        self.save_button.clicked.connect(self.save_image)
        
        self.init_table()
    
    def init_table(self):
        """테이블 초기화 (기본값 0 설정)"""
        for i in range(10):
            for j in range(10):
                item = QTableWidgetItem("0")
                item.setTextAlignment(Qt.AlignCenter)
                self.table.setItem(i, j, item)
    
    def get_table_data(self):
        """테이블에서 데이터 가져오기"""
        data = np.zeros((10, 10))
        for i in range(10):
            for j in range(10):
                item = self.table.item(i, j)
                if item and item.text():
                    try:
                        data[i, j] = float(item.text())
                    except ValueError:
                        data[i, j] = 0
        return data
    
    def plot_contour(self):
        """등고선 그래프 그리기"""
        data = self.get_table_data()
        fig, ax = plt.subplots()
        c = ax.contourf(data, cmap='jet')
        plt.colorbar(c)
        
        # 그래프를 QLabel에 표시
        fig.canvas.draw()
        image_path = "contour_plot.png"
        fig.savefig(image_path)
        self.graph_label.setPixmap(QPixmap(image_path))
        plt.close(fig)
    
    def clear_table(self):
        """테이블 데이터 초기화"""
        self.init_table()
        self.graph_label.clear()
    
    def save_image(self):
        """등고선 그래프 저장"""
        file_path, _ = QFileDialog.getSaveFileName(self, "이미지 저장", "contour_plot.png", "PNG Files (*.png)")
        if file_path:
            pixmap = self.graph_label.pixmap()
            if pixmap:
                pixmap.save(file_path)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ContourPlotApp()
    window.show()
    sys.exit(app.exec())

 

5. 프로그램 실행 화면

 

실행하면 아래와 같은 화면이 나오며 실행이됩니다.

 

이제 값을 입력하고 등고선이 만들어지는지 보도록 하겠습니다.

 

정확하게 나오는군요 오늘의 포스팅은 마치도록 하겠습니다.