• 实战PyQt5:157-QChart图表之动态样条曲线


    让图表动起来

    在很多时候,需要对图表里的一些元素进行动态显示,不仅可以使图表更生动,更形象地展示数据变化趋势,还有在数据实时采集的时候,也需要不间断地显示新采集的数,这时候图表中的数据序列是动态的,图表也是动态显示的。

    在QChart中,可以使用
    QChart.setAnimationOptions()方法对图表中的各种元素进行动画显示:

    • QChart.GridAxisAnimations: 图表中的网格和坐标轴以动画方式显示。
    • QChart.SeriesAnimations:图表中的图形序列以动画方式显示。
    • QChart.AllAnimations:上述两种情况都以动画方式显示。

    另外,一定时间间隔刷新图表序列的数据,就可以在图标中展现动态的图形序列。比如,在下面的示例中,使用定时器QTimer,在500毫秒的间隔内,刷新样条曲线的数据,我们就可以在图标中看到一条动态的样条曲线。

    动态样条曲线演示

    样例代码演示了使用定时器,定时刷新在图表中显示样条曲线的数据,同时也演示了
    QChart.setAnimationOptions()设置图表的动画显示方式。完整代码如下:

    1. import sys
    2. from PyQt5.QtCore import Qt, QTimer, QRandomGenerator
    3. from PyQt5.QtGui import QPainter, QPen
    4. from PyQt5.QtWidgets import QApplication, QMainWindow
    5. from PyQt5.QtChart import QChart, QChartView,QSplineSeries, QValueAxis
    6.  
    7. class MyChart(QChart):
    8.     def __init__(selfparent = None):
    9.         super(MyChartself).__init__(parent)
    10.         
    11.         self.series = None
    12.         self.axisX = QValueAxis()
    13.         self.axisY = QValueAxis()
    14.         self.step = 0
    15.         self.x = 5
    16.         self.y = 1
    17.         
    18.         #创建一个定时器
    19.         self.timer = QTimer()
    20.         self.timer.timeout.connect(self.handleTimeout)
    21.         self.timer.setInterval(500)
    22.         
    23.         self.series = QSplineSeries(self)
    24.         redPen = QPen(Qt.red)
    25.         redPen.setWidth(3)
    26.         self.series.setPen(redPen)
    27.         self.series.append(self.xself.y)
    28.         
    29.         self.addSeries(self.series)
    30.         
    31.         self.addAxis(self.axisXQt.AlignBottom)
    32.         self.addAxis(self.axisYQt.AlignLeft)
    33.         self.series.attachAxis(self.axisX)
    34.         self.series.attachAxis(self.axisY)
    35.         self.axisX.setTickCount(5)
    36.         self.axisX.setRange(0, 10)
    37.         self.axisY.setRange(-5, 10)
    38.         
    39.         self.timer.start()
    40.         
    41.     def handleTimeout(self):
    42.         x = self.plotArea().width() / self.axisX.tickCount()
    43.         y = (self.axisX.max() - self.axisX.min()) / self.axisX.tickCount()
    44.         self.x += y
    45.         self.y = QRandomGenerator.global_().bounded(5) - 2.5
    46.         self.series.append(self.xself.y)
    47.         self.scroll(x, 0)
    48.         if self.x == 100:
    49.             self.timer.stop()
    50.         
    51.  
    52. class DemoDynamicSpline(QMainWindow):
    53.     def __init__(selfparent=None):
    54.         super(DemoDynamicSplineself).__init__(parent)   
    55.         
    56.          # 设置窗口标题
    57.         self.setWindowTitle('实战 Qt for Python: 动态样条曲线演示')      
    58.         # 设置窗口大小
    59.         self.resize(480, 360)
    60.         
    61.         self.createChart()
    62.     
    63.     def createChart(self):
    64.         chart = MyChart()
    65.         chart.setTitle('动态样条曲线')
    66.         chart.legend().hide()
    67.         chart.setAnimationOptions(QChart.AllAnimations)
    68.         
    69.         chartView = QChartView(chart)
    70.         chartView.setRenderHint(QPainter.Antialiasing)
    71.         self.setCentralWidget(chartView)
    72.       
    73.         
    74. if __name__ == '__main__':
    75.     app = QApplication(sys.argv)
    76.     window = DemoDynamicSpline()
    77.     window.show()
    78.     sys.exit(app.exec())   

    运行结果如下图:

     动态样条曲线显示

    本文知识点

    • 使用QChart.setAnimationOptions()设置图表的动画显示方式;
    • 使用QTimer动态更新图形序列数据,动态显示图形。

    前一篇:实战PyQt5: 156-QChart图表之更换图表主题

  • 相关阅读:
    redo log 和 binlog 的一些总结
    Tomcat漏洞利用工具-TomcatVuln
    建立JDBC连接
    SpringBoot项目自定义注解实现RBAC权限校验
    RabbitMQ高级特性
    猪齿鱼实践之持续交付中的分支管理与版本控制
    xss靶场练习之xss.haozi.me解析及答案
    Maven 知识点总结
    记录一个爬虫过程,从基础爬虫到逆向,再到jsrpc,再到selenium,啥都包括了
    电影院排行查询易语言代码
  • 原文地址:https://blog.csdn.net/seniorwizard/article/details/125615475