PyQt개발강좌, PyQtGraph로 데이터 시각화 구현하기

안녕하세요! 이번 블로그 포스트에서는 PyQt와 PyQtGraph를 활용하여 데이터 시각화를 구현하는 방법에 대해 알아보겠습니다. 데이터 시각화는 데이터를 더 이해하기 쉽게 표현하는 중요한 과정입니다. 우리가 다룰 PyQtGraph는 Python에서 데이터 시각화를 간단하고 효과적으로 해주는 라이브러리입니다.

PyQt와 PyQtGraph 소개

PyQt는 Python에서 Qt 라이브러리를 사용하도록 해주는 바인딩으로, 크로스 플랫폼 GUI 어플리케이션을 작성하는 데 유용합니다. PyQt의 강력함 덕분에, 개인 프로젝트는 물론 사이드 프로젝트, 상용 프로젝트 등 다양한 용도로 활용되고 있습니다.

PyQtGraph는 SciPy 기반의 Python GUI 라이브러리로, PyQt 어플리케이션에서 동적인 그래프와 이와 관련된 데이터를 시각화하는 데 매우 적합합니다. NumPy와 같은 기본 데이터 과학 패키지와의 통합이 잘 되어 있습니다.

PyQtGraph 설치

PyQtGraph는 pip을 통해 쉽게 설치할 수 있습니다. 아래의 명령어를 사용하여 설치해 봅시다:

pip install pyqtgraph

또한 PyQt5도 설치해야 합니다:

pip install PyQt5

기본적인 PyQtGraph 사용법

PyQtGraph를 사용하기 위한 기본적인 코드 구조를 살펴보겠습니다. 아래 예제는 PyQtGraph를 사용하여 시간에 따른 간단한 사인 곡선을 그리는 코드입니다.

import sys
from PyQt5.QtWidgets import QApplication
import pyqtgraph as pg
import numpy as np

# PyQt 애플리케이션 생성
app = QApplication(sys.argv)

# PyQtGraph 윈도우 생성
win = pg.GraphicsLayoutWidget(show=True, title="데이터 시각화 예제")
win.resize(800,600)

# 사인 곡선 데이터 생성
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 플롯 추가
plot = win.addPlot(title="사인 곡선")
plot.plot(x, y, pen='r')

# 에플리케이션 실행
sys.exit(app.exec_())

위의 코드에서는 간단한 애플리케이션창을 만들고, 사인 곡선을 그리는 예제를 보여줍니다.

데이터 시각화 구현 예제

이제 기온 데이터를 시각화하는 예제를 통해 PyQtGraph의 기능을 더 깊게 살펴보겠습니다. 이 예제에서는 가상의 기온 데이터를 사용하여 시간대에 따른 기온 변화를 그래프로 나타낼 것입니다.

import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPushButton
import pyqtgraph as pg
import numpy as np

# 데이터 생성
days = np.array([1, 2, 3, 4, 5, 6, 7])
temperatures = np.array([15, 18, 21, 24, 20, 16, 14])

# PyQt 애플리케이션 및 메인 윈도우 생성
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('기온 변화 시각화')
layout = QVBoxLayout()

# PyQtGraph 윈도우 생성
plot_widget = pg.PlotWidget()
layout.addWidget(plot_widget)

# 플롯 추가
plot_widget.plot(days, temperatures, pen='b', symbol='o', symbolSize=10)

# 기타 설정
plot_widget.setTitle('일주일간 기온 변화')
plot_widget.setLabel('left', '온도 (°C)')
plot_widget.setLabel('bottom', '일')

# 데이터 해석을 위한 버튼 생성
def show_average_temp():
    avg_temp = np.mean(temperatures)
    print(f'일주일 평균 기온: {avg_temp:.2f} °C')

button = QPushButton('평균 기온 보기')
button.clicked.connect(show_average_temp)
layout.addWidget(button)

# 레이아웃 설정 및 윈도우 표시
window.setLayout(layout)
window.resize(800, 600)
window.show()

# 애플리케이션 실행
sys.exit(app.exec_())

위 코드에서는 기온 데이터가 plotted 되는 것을 볼 수 있습니다. 사용자 클릭 이벤트를 통해 평균 기온 정보를 출력합니다.

상호작용 추가하기

PyQtGraph에서는 그래픽 객체와의 상호작용을 추가하여 사용자에게 더 나은 경험을 제공할 수 있습니다. 예를 들어, 마우스 클릭 시 데이터 포인트의 정보를 출력하는 기능을 추가할 수 있습니다.

def mouse_clicked(evt):
    pos = evt[0]  # 클릭 위치
    if plot_widget.sceneBoundingRect().contains(pos):
        mouse_point = plot_widget.plotItem.vb.mapSceneToView(pos)
        index = int(mouse_point.x())
        if index >= 0 and index < len(temperatures):
            temp = temperatures[index]
            print(f'일: {index + 1}, 기온: {temp} °C')

# 클릭 이벤트 연결
plot_widget.scene().sigMouseClicked.connect(mouse_clicked)

이 코드를 추가하면 사용자 클릭 시 그 위치에 해당하는 일의 기온이 출력됩니다. pyqtgraph는 다양한 상호작용을 지원하며, 이를 통해 사용자 경험을 강화할 수 있습니다.

더 많은 데이터 시각화 예제

PyQtGraph는 선 그래프, 바 그래프, 산점도, 히스토그램 등 다양한 그래프를 지원합니다. 아래는 바 그래프로 여러 지점의 기온을 시각화하는 예제입니다.

import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
import pyqtgraph as pg
import numpy as np

# 데이터 생성
locations = ['서울', '부산', '대구', '광주', '인천']
temperatures = [15, 18, 21, 24, 20]

# PyQt 애플리케이션 및 메인 윈도우 생성
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('위치별 기온 시각화')
layout = QVBoxLayout()

# PyQtGraph 윈도우 생성
bar_graph = pg.BarGraphItem(x0=np.arange(len(locations)), 
                             x1=np.arange(len(locations)) + 0.5, 
                             height=temperatures, 
                             pen='b', 
                             brush='r')
layout.addWidget(pg.PlotWidget(items=[bar_graph]))

# 레이아웃 설정 및 윈도우 표시
window.setLayout(layout)
window.resize(800, 400)
window.show()

# 애플리케이션 실행
sys.exit(app.exec_())

이 코드에서는 각 도시별 기온을 바 그래프로 시각화합니다. pyqtgraph를 통해 간단하게 다양한 형태의 데이터를 시각화할 수 있습니다.

마무리

PyQtGraph는 Python으로 데이터 시각화를 쉽게 구현할 수 있도록 도와주는 강력한 도구입니다. 이번 포스트에서 살펴본 기본적인 예제와 상호작용 기능을 통해 PyQtGraph의 가능성을 확인할 수 있었습니다. 실습을 통해 더 다양한 그래프와 시각화 기법을 탐색해 보시길 권장 드립니다.

여러분도 데이터 시각화를 통해 더 나은 인사이트를 얻으실 수 있기를 바랍니다. 질문이나 의견이 있으면 댓글로 남겨주시기 바랍니다.

감사합니다!