반응형
16) -> 6) -> 2)
2) 그래프 그리기
이번 절에서는 앞서 개발한 메인 레이아웃에 이벤트를 추가해보겠습니다. 메인 윈도우에서 QPushButton을 클릭했을 때 pushButtonClicked 메서드가 호출됩니다. pushButtonClicked 메서드에서는 QLineEdit에 입력된 종목 코드를 얻어온 후 pandas 모듈을 이용해 20일 이동평균 값과 60일 이동평균 값을 계산한 후 그래프로 출력합니다.
예제 16.22는 그림 16.47 프로그램의 전체 코드입니다. 프로그램을 실행한 후 078930.KS를 입력하고 버튼을 클릭하면 그래프가 출력됩니다. 참고로 078930.KS는 GS의 종목 코드입니다.
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import pandas_datareader.data as web
import pandas as pd
from pandas import Series, DataFrame
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
self.setGeometry(600, 200, 1200, 600)
self.setWindowTitle("PyChart Viewer v0.1")
self.setWindowIcon(QIcon('icon.png'))
self.lineEdit = QLineEdit()
self.pushButton = QPushButton("차트그리기")
self.pushButton.clicked.connect(self.pushButtonClicked)
self.fig = plt.Figure()
self.canvas = FigureCanvas(self.fig)
leftLayout = QVBoxLayout()
leftLayout.addWidget(self.canvas)
# Right Layout
rightLayout = QVBoxLayout()
rightLayout.addWidget(self.lineEdit)
rightLayout.addWidget(self.pushButton)
rightLayout.addStretch(1)
layout = QHBoxLayout()
layout.addLayout(leftLayout)
layout.addLayout(rightLayout)
layout.setStretchFactor(leftLayout, 1)
layout.setStretchFactor(rightLayout, 0)
self.setLayout(layout)
def pushButtonClicked(self):
code = self.lineEdit.text()
web.DataReader(code + ".ks", "yahoo")
df['MA20'] = df['Adj Close'].rolling(window=20).mean()
df['MA60'] = df['Adj Close'].rolling(window=60).mean()
ax = self.fig.add_subplot(111)
ax.plot(df.index, df['Adj Close'], label='Adj Close')
ax.plot(df.index, df['MA20'], label='MA20')
ax.plot(df.index, df['MA60'], label='MA60')
ax.legend(loc='upper right')
ax.grid()
self.canvas.draw()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()
예제 16.22 그래프 그리기 이벤트 추가(소스코드: book/ch16/26.py)
pushButtonClicked 메서드에 대해 조금 더 자세히 살펴보겠습니다. QLineEdit 객체로부터 사용자가 입력한 종목 코드를 얻어온 후 pandas 모듈을 통해 주가 이동 평균값을 계산합니다.
code = self.lineEdit.text()
web.DataReader(code + ".ks", "yahoo")
df['MA20'] = df['Adj Close'].rolling(window=20).mean()
df['MA60'] = df['Adj Close'].rolling(window=60).mean()
그래프를 그리기 위해 add_subplot 메서드를 호출해 AxesSubplot 객체를 생성한 후 plot 메서드를 통해 그래프를 그립니다. 마찬가지로 범례와 그리드도 그립니다.
ax = self.fig.add_subplot(111)
ax.plot(df.index, df['Adj Close'], label='Adj Close')
ax.plot(df.index, df['MA20'], label='MA20')
ax.plot(df.index, df['MA60'], label='MA60')
ax.legend(loc='upper right')
ax.grid()
마지막으로 FigureCanvas 객체에 그래프를 그리기 위해 draw 메서드를 호출합니다.
self.canvas.draw()
반응형
'Python' 카테고리의 다른 글
초보자를 위한 Python GUI 프로그래밍 - PyQt5 (0) | 2023.08.16 |
---|---|
[Python] Pandas DataFrame (0) | 2023.07.21 |
[Python] DataFrame Matplot Pandas (0) | 2023.07.21 |
[Python] Python Data Visualization (0) | 2023.07.21 |
[Python PyQt5] PyQt5 Tutorial - 파이썬으로 만드는 나만의 GUI 프로그램 (0) | 2023.07.21 |
댓글