본문 바로가기

PYQT5/QtChart

[파이썬, PYQT5-QtChart] 캔들스틱차트 생성, 타이틀 설정, 데이터 삽입, 색상 변경, 좌표축 설정

  • 전체 소스
더보기
import sys

from PyQt5.QtChart import QChart, QChartView, QCandlestickSeries, QCandlestickSet, QDateTimeAxis, \
    QValueAxis
from PyQt5.QtCore import QSize, Qt, QDateTime
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout



class MainScreen(QMainWindow):

    def __init__(self, wid, hei):
        super().__init__()

        self.setWindowTitle("TEST SCREEN")  # 프로젝트 타이틀 설정
        self.setGeometry(0, 0, int(wid * .5), int(hei * .5))  # 화면 사이즈 설정

        self.mainWidget = QWidget()                     # 메인 위젯 생성
        self.mainLayout = QGridLayout(self.mainWidget)  # 메인 레이아웃 생성 및 메인 위젯 연결
        self.mainLayout.setSpacing(100)
        self.setCentralWidget(self.mainWidget)          # 메인윈도우 센트럴위젯에 메인 위젯 연결

        # 캔들스틱 차트 생성 (타이틀)
        self.sample1(0, 0)

        # 캔들스틱 차트 (캔들 데이터 삽입)
        self.sample2(0, 1)

        # 캔들스틱 차트 (캔들 색상 변경)
        self.sample3(1, 0)

        # 캔들스틱 차트 (X축, Y축 설정)
        self.sample4(1, 1)

        self.showMaximized()

    def sample1(self, row, col):

        # 캔들스틱 시리즈 생성
        series = QCandlestickSeries()

        # 차트 생성
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)
        chart.createDefaultAxes()           # 기본 좌표 생성
        chart.setTitle("candlestick Chart")    #  타이틀 설정

        # 차트 뷰 생성
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)     # 안티알리아싱 설정

        self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

    def sample2(self, row, col):

        # 시리즈 생성
        series = QCandlestickSeries()

        # 타임스탬프
        ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 0
             ,QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 1
            , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 2
            , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 3
            , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 4
            , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 5
            , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 6
            , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 7
            , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 8
            , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]   # 9



        # 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
        series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
        series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
        series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
        series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
        series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
        series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
        series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
        series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
        series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
        series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))


        # 차트 생성
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)         # 차트에 시리즈 추가
        chart.createDefaultAxes()       # 기본 좌표 생성
        chart.setTitle("candlestick Chart")  # 타이틀

        # 차트 뷰 생성
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)     # 안티알리아싱 설정

        self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

    def sample3(self, row, col):

        # 시리즈 생성
        series = QCandlestickSeries()

        series.setIncreasingColor(Qt.red)  # 시작가 보다 종료가가 클때 색상 설정 (붉은색)
        series.setDecreasingColor(Qt.blue)  # 시작가 보다 종료가가 작을때 색상 설정 (파란색)

        # 타임스탬프
        ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 0
            , QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 1
            , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 2
            , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 3
            , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 4
            , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 5
            , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 6
            , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 7
            , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 8
            , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]  # 9

        # 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
        series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
        series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
        series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
        series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
        series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
        series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
        series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
        series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
        series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
        series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))

        # 차트 생성
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)  # 차트에 시리즈 추가
        chart.createDefaultAxes()  # 기본 좌표 생성
        chart.setTitle("candlestick Chart")  # 타이틀

        # 차트 뷰 생성
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)  # 안티알리아싱 설정

        self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

    def sample4(self, row, col):
        # 시리즈 생성
        series = QCandlestickSeries()

        series.setIncreasingColor(Qt.red)  # 시작가 보다 종료가가 클때 색상 설정 (붉은색)
        series.setDecreasingColor(Qt.blue)  # 시작가 보다 종료가가 작을때 색상 설정 (파란색)

        # 타임스탬프
        ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 0
            , QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 1
            , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 2
            , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 3
            , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 4
            , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 5
            , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 6
            , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 7
            , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 8
            , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]  # 9

        # 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
        series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
        series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
        series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
        series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
        series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
        series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
        series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
        series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
        series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
        series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))

        # X축 설정
        self.axis_x = QDateTimeAxis()
        self.axis_x.setFormat("hh:mm:ss")

        # Y축 설정
        self.axis_y = QValueAxis()
        self.axis_y.setLabelFormat("%i")

        # 차트 생성
        chart = QChart()
        chart.legend().hide()
        chart.addSeries(series)  # 차트에 시리즈 추가

        chart.addAxis(self.axis_x, Qt.AlignBottom)  # x축 좌표 설정
        chart.addAxis(self.axis_y, Qt.AlignLeft)  # y축 좌표 설정

        series.attachAxis(self.axis_x)          # 시리즈 X축 좌표 설정
        series.attachAxis(self.axis_y)          # 시리즈 Y축 좌표 설정

        chart.setTitle("candlestick Chart")  # 타이틀

        # 차트 뷰 생성
        chart_view = QChartView(chart)
        chart_view.setRenderHint(QPainter.Antialiasing)  # 안티알리아싱 설정

        self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

if __name__ == '__main__':

    app = QApplication(sys.argv)
    size: QSize = app.primaryScreen().size()    # 모니터 사이즈

    main = MainScreen(size.width()/2, size.height())
    sys.exit(app.exec_())

 


 

 

 

1. 캔들스틱 차트 생성 (타이틀 설정)

# 캔들스틱 시리즈 생성
series = QCandlestickSeries()

# 차트 생성
chart = QChart()
chart.legend().hide()
chart.addSeries(series)
chart.createDefaultAxes()           # 기본 좌표 생성
chart.setTitle("candlestick Chart")    #  타이틀 설정

# 차트 뷰 생성
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.Antialiasing)     # 안티알리아싱 설정

self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

 

타이틀 - candlestick Chart


 

 

 

2. 캔들스틱 차트 (캔들 데이터 삽입)

# 시리즈 생성
series = QCandlestickSeries()

# 타임스탬프
ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 0
     ,QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 1
    , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 2
    , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 3
    , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 4
    , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 5
    , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 6
    , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 7
    , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()    # 8
    , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]   # 9



# 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))


# 차트 생성
chart = QChart()
chart.legend().hide()
chart.addSeries(series)         # 차트에 시리즈 추가
chart.createDefaultAxes()       # 기본 좌표 생성
chart.setTitle("candlestick Chart")  # 타이틀

# 차트 뷰 생성
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.Antialiasing)     # 안티알리아싱 설정

self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

캔들데이터 삽입

 


 

 

 

 

3. 캔들스틱 차트 (캔들 색상 변경)

# 시리즈 생성
series = QCandlestickSeries()

# 색상 설정
series.setIncreasingColor(Qt.red)  # 시작가 보다 종료가가 클때 색상 설정 (붉은색)
series.setDecreasingColor(Qt.blue)  # 시작가 보다 종료가가 작을때 색상 설정 (파란색)

# 타임스탬프
ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 0
    , QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 1
    , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 2
    , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 3
    , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 4
    , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 5
    , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 6
    , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 7
    , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 8
    , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]  # 9

# 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))

# 차트 생성
chart = QChart()
chart.legend().hide()
chart.addSeries(series)  # 차트에 시리즈 추가
chart.createDefaultAxes()  # 기본 좌표 생성
chart.setTitle("candlestick Chart")  # 타이틀

# 차트 뷰 생성
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.Antialiasing)  # 안티알리아싱 설정

self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

캔들 색상 변경

 


 

 

 

 

4. 캔들스틱 차트 (X축, Y축 설정)

# 시리즈 생성
series = QCandlestickSeries()

series.setIncreasingColor(Qt.red)  # 시작가 보다 종료가가 클때 색상 설정 (붉은색)
series.setDecreasingColor(Qt.blue)  # 시작가 보다 종료가가 작을때 색상 설정 (파란색)

# 타임스탬프
ts = [QDateTime.fromString("2022 07 20 12 00 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 0
    , QDateTime.fromString("2022 07 20 12 05 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 1
    , QDateTime.fromString("2022 07 20 12 10 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 2
    , QDateTime.fromString("2022 07 20 12 15 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 3
    , QDateTime.fromString("2022 07 20 12 20 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 4
    , QDateTime.fromString("2022 07 20 12 25 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 5
    , QDateTime.fromString("2022 07 20 12 30 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 6
    , QDateTime.fromString("2022 07 20 12 35 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 7
    , QDateTime.fromString("2022 07 20 12 40 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()  # 8
    , QDateTime.fromString("2022 07 20 12 45 00", "yyyy MM dd hh mm ss").toMSecsSinceEpoch()]  # 9

# 캔들 데이터 추가 (시작가, 상한가, 하한가, 종료가, 타임스탬프)
series.append(QCandlestickSet(10, 20, 8, 15, ts[0]))
series.append(QCandlestickSet(15, 30, 15, 25, ts[1]))
series.append(QCandlestickSet(25, 30, 25, 28, ts[2]))
series.append(QCandlestickSet(28, 30, 20, 23, ts[3]))
series.append(QCandlestickSet(23, 25, 15, 19, ts[4]))
series.append(QCandlestickSet(19, 50, 18, 30, ts[5]))
series.append(QCandlestickSet(30, 49, 28, 35, ts[6]))
series.append(QCandlestickSet(35, 39, 34, 38, ts[7]))
series.append(QCandlestickSet(38, 45, 38, 44, ts[8]))
series.append(QCandlestickSet(44, 49, 40, 48, ts[9]))

# X축 설정
self.axis_x = QDateTimeAxis()
self.axis_x.setFormat("hh:mm:ss")

# Y축 설정
self.axis_y = QValueAxis()
self.axis_y.setLabelFormat("%i")

# 차트 생성
chart = QChart()
chart.legend().hide()
chart.addSeries(series)  # 차트에 시리즈 추가

chart.addAxis(self.axis_x, Qt.AlignBottom)  # x축 좌표 설정
chart.addAxis(self.axis_y, Qt.AlignLeft)  # y축 좌표 설정

series.attachAxis(self.axis_x)          # 시리즈 X축 좌표 설정
series.attachAxis(self.axis_y)          # 시리즈 Y축 좌표 설정

chart.setTitle("candlestick Chart")  # 타이틀

# 차트 뷰 생성
chart_view = QChartView(chart)
chart_view.setRenderHint(QPainter.Antialiasing)  # 안티알리아싱 설정

self.mainLayout.addWidget(chart_view, row, col)  # 메인 레이아웃에 라인에디트 위젯 추가

X축, Y축 포맷 설정