烛台图(Candlestick Chart)最常见的应用就是表示诸如股票交易当日成交价格幅度以及开盘及收盘价格的图表。QChart中提供类QCandlestickSeries, QCandlestickSet来实现绘制烛台图。
QCandlestickSeries类将数据表示为烛台样的图形。本类充当单个条目的容器。使用QBarCategoryAxis时,每个条目都绘制到自己的类别中。QDateTimeAxis和QValueAxis可以用来替代QBarCategoryAxis。在这种情况下,每个条目均根据其时间戳值绘制。
QCandlestickSeries常用函数:
QCandlestickSeries常用信号:
QCandlestickSet类表示烛台图中的单个烛台条目。需要五个值来创建烛台条目的图形表示形式:open,high,low,close和timestamp。可以在创建对象时设置,也可以使用setOpen(),setHigh(),setLow(),setClose()和setTimestamp()进行设置。
QCandlestickSet常用函数:
QCandlestickSet常用信号:
参考Qt样例代码,创建类CandlestickDataReader用于读取文本文件,并将其数据设置为QCandlestickSet项,添加到QCandlestickSeries中,然后将QCandlestickSeries对象设置到图表,使用图表视图显示出来。使用的数据文件acme_data.txt的数据如下图:
acme_data.txt
资源文件candlestickdata.qrc:
- <RCC>
- <qresource prefix="/">
- <file alias="acme">acme_data.txt</file>
- </qresource>
- </RCC>
完整代码如下:
- import sys
- from PyQt5.QtCore import Qt, QIODevice, QTextStream, QFile, QDateTime
- from PyQt5.QtGui import QPainter, QColor
- from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
- from PyQt5.QtChart import (QChartView, QChart, QCandlestickSeries, QCandlestickSet,
- QBarCategoryAxis, QValueAxis)
-
- import candlestickdata_rc
-
- #读取文本数据
- class CandlestickDataReader(QTextStream):
- def __init__(self, device, parent = None):
- super(CandlestickDataReader, self).__init__(parent)
- self.setDevice(device)
-
- def readFile(self, device):
- self.setDevice(device)
-
- #从文本路中读取一行交易数据
- def readCandlestickSet(self):
- line = self.readLine()
- if line.startswith('#') or line=='':
- return None
-
- strList = line.split(' ')
- if len(strList) != 5:
- return None
-
- timestamp = float(strList[0])
- open = float(strList[1])
- high = float(strList[2])
- low = float(strList[3])
- close = float(strList[4])
-
- candlestickSet = QCandlestickSet(timestamp)
- candlestickSet.setOpen(open)
- candlestickSet.setHigh(high)
- candlestickSet.setLow(low)
- candlestickSet.setClose(close)
-
- return candlestickSet
-
-
- class DemoChartCandlestick(QMainWindow):
- def __init__(self, parent=None):
- super(DemoChartCandlestick, self).__init__(parent)
-
- # 设置窗口标题
- self.setWindowTitle('实战 Qt for Python: QChart样条曲线演示')
- # 设置窗口大小
- self.resize(600, 360)
-
- self.createChart()
-
- def createChart(self):
-
- #烛台图
- acmeSeries = QCandlestickSeries()
- acmeSeries.setName('Acm Ltd')
- acmeSeries.setIncreasingColor(QColor(Qt.green))
- acmeSeries.setDecreasingColor(QColor(Qt.red))
-
- acmeData = QFile(':acme')
- if not acmeData.open(QIODevice.ReadOnly | QIODevice.Text):
- QMessageBox.information(self, '读数据', '不合法的数据文件')
- return
-
- dataReader = CandlestickDataReader(acmeData)
- categories = []
- while not dataReader.atEnd():
- csSet = dataReader.readCandlestickSet()
- if not csSet is None:
- acmeSeries.append(csSet)
- categories.append(QDateTime.fromMSecsSinceEpoch(csSet.timestamp()).toString('dd'))
-
- #创建图表
- chart = QChart()
- chart.addSeries(acmeSeries)
- chart.setTitle('Acme 公司历史数据 (2015年7月)')
- chart.setAnimationOptions(QChart.SeriesAnimations)
-
- #坐标轴设置
- chart.createDefaultAxes()
-
- #横轴
- axisX = chart.axes(Qt.Horizontal)[0]
- axisX.setCategories(categories)
-
- #调整纵坐标轴值的范围
- axisY = chart.axes(Qt.Vertical)[0]
- axisY.setMax(int(axisY.max() * 1.01))
- axisY.setMin(int(axisY.min() * 0.99))
-
- #图例位置
- chart.legend().setVisible(True)
- chart.legend().setAlignment(Qt.AlignBottom)
-
- #图表视图
- chartView = QChartView(chart)
- chartView.setRenderHint(QPainter.Antialiasing)
-
- self.setCentralWidget(chartView)
-
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- window = DemoChartCandlestick()
- window.show()
- sys.exit(app.exec())
运行结果如下图:
QChart烛台图演示