• 实战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图表之更换图表主题

  • 相关阅读:
    c文件如何编译为ko的MAKEFILE文件编写
    一次简单的 JVM 调优,拿去写到简历里
    《视觉SLAM十四讲》-- 后端 1(下)
    关于ESP32烧录的问题 - No serial data received
    hadoop3.x集群搭建
    【0基础百日刷题】洛谷刷题知识拾遗
    shell: 遍历目录下的文件并查看
    软设之冒泡排序
    数据可视化 复习笔记2022
    文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题
  • 原文地址:https://blog.csdn.net/seniorwizard/article/details/125615475