实战PyQt5: 140-QChart图表之烛台图_pyqt candlestickset-程序员宅基地

技术标签: python  gui编程  qt  编码  pyside2  pyqt5  

烛台图(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:

<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烛台图演示

本文知识点

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/seniorwizard/article/details/125556673

智能推荐

Servlet[jsp]的Servlet.service()引发了具有根本原因的异常无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/js_在路径为/helloworld的上下文中,servlet[jsp]的servlet.service(-程序员宅基地

文章浏览阅读1.6w次。问题描述28-Jul-2020 11:44:56.960 严重 [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke 在路径为的上下文中,Servlet[jsp]的Servlet.service()引发了具有根本原因的异常无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core] org.apache.jasper.Ja_在路径为/helloworld的上下文中,servlet[jsp]的servlet.service()引发了具有根本

今天的语音识别,我们就用Python来做,从基础的知识到实践的运用-程序员宅基地

文章浏览阅读412次。昨天用Python做了一个语音识别,就给大家分享一下心得,需要Python学习资料的小伙伴可以私信我,回复01系统会自动发送学习资料。最为重要的是,在 Python 程序中实现语音识别非常简单。阅读本文章,你将会了解到Python是如何制作语音识别的。你将会学习到:语言识别工作原理概述语音识别的首要部分当然是语音。通过麦克风,语音便从物理声音被转换为电信号,然后通过模数转换器转换为数据。一旦被数字..._语音识别用什么语言编写最简单

(self: pyds.NvDsComp_BboxInfo) -> _NvBbox_Coords_unable to convert function return value to a pytho-程序员宅基地

文章浏览阅读4.1k次。文章目录项目场景与问题描述:原因分析:解决方案:项目场景与问题描述:调用python deepstream API,改写deepstream_test_3.py,出现如下报错:TypeError: Unable to convert function return value to a Python type! The signature was(self: pyds.NvDsComp_BboxInfo) -> _NvBbox_Coords本次使用的盒子系统配置如下:原因分析:当前_unable to convert function return value to a python type! the signature was

html css文本框边框样式,HTML 学习笔记 CSS样式(边框)-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏5次。元素的边框(border)是围绕元素内容和内边距的一条或多条线CSS border 属性允许你规定边框的样式 宽度和颜色CSS 边框在 HTML 中,我们使用表格来创建文本周围的边框,但是通过使用 CSS 边框属性,我们可以创建出效果出色的边框,并且可以应用于任何元素。元素外边距内就是元素的的边框 (border)。元素的边框就是围绕元素内容和内边据的一条或多条线。每个边框有 3 个方面:宽度、样..._css文本框

《Python编程 从入门到实践》第十一章课后习题_python从入门到实践第11章-程序员宅基地

文章浏览阅读519次。11-1import unittestdef get_location(country, city): return country.title() + ', ' + city.title();class LocationTestCase(unittest.TestCase): def test_city_country(self): location = ..._python从入门到实践第11章

探秘RictyDiminished:一款轻量级的Markdown字体库-程序员宅基地

文章浏览阅读318次,点赞5次,收藏4次。探秘RictyDiminished:一款轻量级的Markdown字体库项目地址:https://gitcode.com/edihbrandon/RictyDiminished项目简介RictyDiminished 是一个专为Markdown阅读和编写优化的开源字体库。该项目旨在提供一种清晰、易读且简洁的字体体验,特别适用于程序员和写作爱好者在日常工作中处理Markdown文档。技术分析R...

随便推点

STM32定时器TIM1输出互补脉冲加死区_tim_break_disable-程序员宅基地

文章浏览阅读3.9k次。下面是代码和个人愚见,还没完全搞透,但基本发现以下规律。调试的过程中出现一个问题,就是没有波形输出。原因是刹车和死区的配置中, tim1_BDTR.TIM_Break=TIM_Break_Disable;//TIM_Break_Enable;刹车要失能(Disable),具体原因和MOE相关寄存器配置有关。另外还有个参数疑问,就是oc.TIM_OCIdleState = TIM_OCId..._tim_break_disable

SpringCloud Alibaba微服务运维一 - 集成SkyWalking,一线互联网公司面经总结_微服务 spring cloud alibaba 维护复杂吗-程序员宅基地

文章浏览阅读991次,点赞14次,收藏19次。设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?5、LVS、Nginx、HAproxy有什么区别?9、讲述一下Tomcat8005、8009、8080三个端口的含义?12、简述DNS进行域名解析的过程?_微服务 spring cloud alibaba 维护复杂吗

LeetCode-----第二十五题-----K 个一组翻转链表_给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,-程序员宅基地

文章浏览阅读133次。K 个一组翻转链表难度:困难给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当k= 2 时,应当返回:2->1->4->3->5当k= 3 时,应当返回:3->2->1->4->5说明:你的算法只能使..._给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,

基于 Python 环境搭建 - YOLO 实现吸烟行为监测_out_boxes.reshape-程序员宅基地

文章浏览阅读5.5k次,点赞8次,收藏36次。作者|李秋键出品|AI科技大本营(ID:rgznai100)引言目标检测是一种与计算机视觉和图像处理有关的计算机技术, 用于检测数字图像和视频中特定类别的语义对象 (例如人、建筑物或汽车等..._out_boxes.reshape

Android 拦截或屏蔽返回键_android 返回键拦截-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏12次。在Android开发中我们常常会遇到需要拦截或屏蔽返回键的需求,对拦截后的返回键进行特殊操作。监听返回键有两种方式1、重写OnBackPressed方法@Override public void onBackPressed() { // 完全由自己控制返回键逻辑,系统不再控制,但是有个前提是: // 不要在Activity的onKeyDown或者OnK..._android 返回键拦截

设置APP字体大小不跟随手机系统字体而改变_软件字体不跟随苹果系统字体-程序员宅基地

文章浏览阅读9.6k次。设置H5页面中字体大小不跟随手机系统 WebSettings webSettings = webView.getSettings(); webSettings.setTextZoom(100);设置原生APP字体不跟随系统字体而变化在acvitity的父类中重写getResource方法 @Override public Resources getResourc..._软件字体不跟随苹果系统字体

推荐文章

热门文章

相关标签