• 实战PyQt5: 140-QChart图表之烛台图


    烛台图(Candlestick Chart)最常见的应用就是表示诸如股票交易当日成交价格幅度以及开盘及收盘价格的图表。QChart中提供类QCandlestickSeries, QCandlestickSet来实现绘制烛台图。

    QCandlestickSeries

    QCandlestickSeries类将数据表示为烛台样的图形。本类充当单个条目的容器。使用QBarCategoryAxis时,每个条目都绘制到自己的类别中。QDateTimeAxis和QValueAxis可以用来替代QBarCategoryAxis。在这种情况下,每个条目均根据其时间戳值绘制。

    QCandlestickSeries常用函数:

    • append(self, set):将由set指定的单个烛台条目添加到烛台图中,并获得其所有权。如果该项为空或已在系列中,则不会附加该项。如果添加成功返回True,否则返回False。
    • clear(self): 永久删除图中的所有条目。
    • remove(self, set):从烛台图中删除set指定的条目。
    • take(self, set):从图中获取由set指定的单个条目。但不删除该条目。
    • setBodyOutlineVisible(self, bodyOutlineVisible):设置烛台轮廓是否可见。
    • setBodyWidth(self, bodyWidth):设置烛台条目的相对宽度,范围为0.0到1.0。
    • setBrush(self, brush):设置烛台条目的画刷。
    • setPen(self, pen):设置烛台条目线条的画笔。
    • setCapsVisible(self, capsVisible):设置烛台条目盖是否可见。
    • setCapsWidth(self, capsWidth): 设置烛台条目盖的宽度。
    • setDecreasingColor(self, decreasingColor):设置烛台条目递减颜色。
    • setIncreasingColor(self, increasingColor):设置烛台条目递增颜色。
    • setMaximumColumnWidth(self, maximumColumnWidth):设置烛台条目的最大宽度(以像素为单位。设置为负值表示没有最大宽度。所有负值都将转换为-1.0 )。
    • setMinimumColumnWidth(self, minimumColumnWidth):设置烛台条目的最小宽度(以像素为单位。设置为负值表示没有最大宽度。所有负值都将转换为-1.0 )。

    QCandlestickSeries常用信号:

    • bodyOutlineVisibilityChanged(self):烛台条目主体轮廓的可见性更改时,将发出此信号。
    • bodyWidthChanged(self):烛台条目的宽度更改时,将发出此信号。
    • brushChanged(self):烛台条目画刷更改时,将发出此信号。
    • candlestickSetsAdded(self, sets):当sets指定的烛台条目添加到烛台图中时,将发出此信号。
    • candlestickSetsRemoved(self, sets):从烛台图中删除sets指定的烛台条目时,将发出此信号。
    • capsVisibilityChanged(self):烛台条目盖的可见属性更改时,将发出此信号。
    • capsWidthChanged(self): 烛台条目盖的宽度更改时,将发出此信号。
    • clicked(self, set): 单击图表上由set指定的烛台条目时,将发出此信号。
    • countChanged(self):当烛台图中中烛台条目的数量发生更改时,将发出此信号。
    • decreasingColorChanged(self): 当烛台条目的颜色减少时,将发出此信号。
    • doubleClicked(self,set):双击图表上由set指定的烛台条目时,将发出此信号。
    • hovered(self, status, set):当鼠标悬停在所指定的烛台条目set时,这个信号被发射。当鼠标移至该条目上方时,state变为True,而当鼠标再次移开时,state变为False。
    • increasingColorChanged(self):烛台条目颜色增加时,将发出此信号。
    • maximumColumnWidthChanged(self): 烛台条目的最大列宽发生变化时,将发出此信号。
    • minimumColumnWidthChanged(self):烛台条目的最小列宽发生变化时,将发出此信号。
    • penChanged(self):烛台图的画笔发生更改时会发出此信号。
    • pressed(self, set):当用户单击set指定的烛台条目并按住鼠标按钮时,将发出此信号。
    • released(self, set):当用户释放set所指定的烛台条目上的鼠标时,将发出此信号。

    QCandlestickSet

    QCandlestickSet类表示烛台图中的单个烛台条目。需要五个值来创建烛台条目的图形表示形式:openhighlowclosetimestamp。可以在创建对象时设置,也可以使用setOpen(),setHigh(),setLow(),setClose()和setTimestamp()进行设置。

    QCandlestickSet常用函数:

    • setBrush(self, brush):设置条目的画刷为brush。
    • setPen(self, pen):设置条目的画笔为pen。
    • setClose(self, close):设置条目的收盘价为close。
    • setHigh(self, high):设置条目的上限值为high。
    • setLow(self, low):设置条目的下限值为low。
    • setOpen(self, open):设置条目的开盘价。
    • setTimestamp(self, timestamp):设置条目的时间戳。

    QCandlestickSet常用信号:

    • brushChanged(self):更改时画刷,将发出此信号。
    • penChanged(self):更改画笔时,将发出此信号。
    • clicked(self):单击条目时,将发出此信号。
    • doubleClicked(self):双击条目时,将发出此信号。
    • hovered(self, status):当鼠标悬停在条目上时,将发出此信号。
    • pressed(self):当用户单击条并按住鼠标按钮时,将发出此信号。
    • released(self):当用户释放对条目的释放鼠标时,将发出此信号。
    • closeChanged(self):条目收盘价发生改变时发出此信号。
    • highChanged(self):条目上限值更改时,将发出此信号。
    • lowChanged(self):条目下限值更改时,将发出此信号。
    • openChanged(self):条目开盘价变化时发出此信号。
    • timestampChanged(self):当条目时间戳更改时,将发出此信号。

    烛台图示例

    参考Qt样例代码,创建类CandlestickDataReader用于读取文本文件,并将其数据设置为QCandlestickSet项,添加到QCandlestickSeries中,然后将QCandlestickSeries对象设置到图表,使用图表视图显示出来。使用的数据文件acme_data.txt的数据如下图:

     acme_data.txt

    资源文件candlestickdata.qrc:

    1. <RCC>
    2.     <qresource prefix="/">
    3.         <file alias="acme">acme_data.txt</file>
    4.     </qresource>
    5. </RCC>

    完整代码如下:

    1. import sys
    2. from PyQt5.QtCore import Qt, QIODevice, QTextStream, QFile, QDateTime
    3. from PyQt5.QtGui import QPainter, QColor
    4. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
    5. from  PyQt5.QtChart import (QChartViewQChartQCandlestickSeriesQCandlestickSet,
    6.                             QBarCategoryAxisQValueAxis)
    7.  
    8. import candlestickdata_rc
    9.  
    10. #读取文本数据
    11. class CandlestickDataReader(QTextStream):
    12.     def __init__(selfdeviceparent = None):
    13.         super(CandlestickDataReaderself).__init__(parent)
    14.         self.setDevice(device)
    15.     
    16.     def readFile(selfdevice):
    17.         self.setDevice(device)
    18.         
    19.     #从文本路中读取一行交易数据
    20.     def readCandlestickSet(self):
    21.         line = self.readLine()
    22.         if line.startswith('#') or line=='':
    23.             return None
    24.         
    25.         strList = line.split(' ')
    26.         if len(strList) != 5:
    27.             return None
    28.         
    29.         timestamp = float(strList[0])
    30.         open = float(strList[1])
    31.         high = float(strList[2])
    32.         low = float(strList[3])
    33.         close = float(strList[4])
    34.         
    35.         candlestickSet = QCandlestickSet(timestamp)
    36.         candlestickSet.setOpen(open)
    37.         candlestickSet.setHigh(high)
    38.         candlestickSet.setLow(low)
    39.         candlestickSet.setClose(close)
    40.         
    41.         return candlestickSet
    42.                
    43.  
    44. class DemoChartCandlestick(QMainWindow):
    45.     def __init__(selfparent=None):
    46.         super(DemoChartCandlestickself).__init__(parent)   
    47.         
    48.          # 设置窗口标题
    49.         self.setWindowTitle('实战 Qt for PythonQChart样条曲线演示')      
    50.         # 设置窗口大小
    51.         self.resize(600, 360)
    52.         
    53.         self.createChart()
    54.         
    55.     def createChart(self):
    56.                 
    57.         #烛台图
    58.         acmeSeries = QCandlestickSeries()
    59.         acmeSeries.setName('Acm Ltd')
    60.         acmeSeries.setIncreasingColor(QColor(Qt.green))
    61.         acmeSeries.setDecreasingColor(QColor(Qt.red))
    62.         
    63.         acmeData = QFile(':acme')
    64.         if not acmeData.open(QIODevice.ReadOnly | QIODevice.Text):
    65.             QMessageBox.information(self, '读数据', '不合法的数据文件')
    66.             return
    67.         
    68.         dataReader = CandlestickDataReader(acmeData)
    69.         categories = []
    70.         while not dataReader.atEnd():
    71.             csSet = dataReader.readCandlestickSet()
    72.             if not csSet is None:
    73.                 acmeSeries.append(csSet)
    74.                 categories.append(QDateTime.fromMSecsSinceEpoch(csSet.timestamp()).toString('dd'))
    75.               
    76.         #创建图表
    77.         chart = QChart()
    78.         chart.addSeries(acmeSeries)
    79.         chart.setTitle('Acme 公司历史数据 (2015年7月)')
    80.         chart.setAnimationOptions(QChart.SeriesAnimations)
    81.         
    82.         #坐标轴设置
    83.         chart.createDefaultAxes()
    84.         
    85.         #横轴
    86.         axisX = chart.axes(Qt.Horizontal)[0]
    87.         axisX.setCategories(categories)
    88.         
    89.         #调整纵坐标轴值的范围
    90.         axisY = chart.axes(Qt.Vertical)[0]
    91.         axisY.setMax(int(axisY.max() * 1.01))
    92.         axisY.setMin(int(axisY.min() * 0.99))
    93.         
    94.         #图例位置
    95.         chart.legend().setVisible(True)
    96.         chart.legend().setAlignment(Qt.AlignBottom)
    97.          
    98.         #图表视图
    99.         chartView = QChartView(chart)
    100.         chartView.setRenderHint(QPainter.Antialiasing)
    101.         
    102.         self.setCentralWidget(chartView)
    103.       
    104.         
    105. if __name__ == '__main__':
    106.     app = QApplication(sys.argv)
    107.     window = DemoChartCandlestick()
    108.     window.show()
    109.     sys.exit(app.exec())   

    运行结果如下图:

     QChart烛台图演示

    本文知识点

    • 烛台图最常见的应用类似股票交易显示。
    • 加载交易数据创建烛台图显示。

    前一篇:实战PyQt5: 139-QChart图表之面积图

  • 相关阅读:
    Nat. Med. | 基于遗传学原发部位未知癌症的分类和治疗反应预测
    gdb调试程序教程
    Metasploit BlueKeep 漏洞利用教程以及在 VMWare 15 Workstation 里靶机出现蓝屏问题
    一种复杂潮汐环境下长路由水深测量方法
    Android打造专有hook,让不规范的代码扼杀在萌芽之中
    [并发编程基础]-集合的线程安全
    1-丁基-3-甲基咪唑氯化锌([BMIM][Zn2Cl5])离子液体
    指针和数组试题解析(4)字符数组部分续集
    Sentinel-限流降级
    【定时同步系列10】16QAM基带调制+Gardener定时误差检测+解调误码率曲线之MATLAB仿真
  • 原文地址:https://blog.csdn.net/seniorwizard/article/details/125556673