본문 바로가기

프로그래밍/PyQt5 GUI

68. PyQtChart 시계열 그래프

주식 데이터는 시계열 데이터이므로 그래프의 x축은 날짜와 시간을 표시합니다.

QtChart 에서 그래프의 x축을 시계열로 표현할 때 QDateTimeAxis 클래스를 사용합니다.

68-1 예제: ex67

import sys
import FinanceDataReader as fdr
import pyupbit as upbit
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import QChart, QChartView, QLineSeries, QDateTimeAxis, QValueAxis
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt

class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # data 셀트리온 주가 지수
        df = fdr.DataReader("068270", "2021")
        series = QLineSeries()

        for i in df.index:
            series.append(i.timestamp() * 1000, df.loc[i]['Close'])

        # chart
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)

        # axis
        axis_x = QDateTimeAxis()
        axis_x.setFormat('MM/dd')
        chart.addAxis(axis_x, Qt.AlignBottom)
        series.attachAxis(axis_x)

        axis_y = QValueAxis()
        axis_y.setLabelFormat('%i')
        chart.addAxis(axis_y, Qt.AlignLeft)
        series.attachAxis(axis_y)

        # margin
        chart.layout().setContentsMargins(0, 0, 0, 0)

        # displaying chart
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)

        # displaying window
        self.setCentralWidget(chart_view)
        self.setMinimumSize(800, 600)
        self.setWindowTitle("QtChart TimeLine")
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyApp()
    sys.exit(app.exec_())

68-2 결과

68-3 예제: 비트코인

import sys
import FinanceDataReader as fdr
import pyupbit
import pyupbit as upbit
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import QChart, QChartView, QLineSeries, QDateTimeAxis, QValueAxis
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt

class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # data 셀트리온 주가 지수
        # df = fdr.DataReader("068270", "2021")
        df = pyupbit.get_ohlcv("KRW-BTC", "2021")
        series = QLineSeries()

        for i in df.index:
            series.append(i.timestamp() * 1000, df.loc[i]['close'])

        # chart
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)

        # axis
        axis_x = QDateTimeAxis()
        axis_x.setFormat('MM/dd')
        chart.addAxis(axis_x, Qt.AlignBottom)
        series.attachAxis(axis_x)

        axis_y = QValueAxis()
        axis_y.setLabelFormat('%i')
        chart.addAxis(axis_y, Qt.AlignLeft)
        series.attachAxis(axis_y)

        # margin
        chart.layout().setContentsMargins(0, 0, 0, 0)

        # displaying chart
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)

        # displaying window
        self.setCentralWidget(chart_view)
        self.setMinimumSize(800, 600)
        self.setWindowTitle("QtChart TimeLine")
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyApp()
    sys.exit(app.exec_())

68-4 결과