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

  • 相关阅读:
    iframe 跨域通信和不跨域通信
    MongoDB命令
    【模拟 简易银行系统~python】
    学信息系统项目管理师第4版系列31_信息系统工程
    JPG如何直接转PDF?分享几个简单小技巧
    多线程的基本使用
    2023年Java核心技术大会(Core Java Week 2023)-核心PPT资料下载
    怎么调整excel表里面所有单元格中,某个相同字体大小,单元格中其他文字大小不变?
    深度学习模型部署 C++学习经历
    学习记录684@vue 统计用户页面停留时间
  • 原文地址:https://blog.csdn.net/seniorwizard/article/details/125615475