在很多时候,需要对图表里的一些元素进行动态显示,不仅可以使图表更生动,更形象地展示数据变化趋势,还有在数据实时采集的时候,也需要不间断地显示新采集的数,这时候图表中的数据序列是动态的,图表也是动态显示的。
在QChart中,可以使用
QChart.setAnimationOptions()方法对图表中的各种元素进行动画显示:
另外,一定时间间隔刷新图表序列的数据,就可以在图标中展现动态的图形序列。比如,在下面的示例中,使用定时器QTimer,在500毫秒的间隔内,刷新样条曲线的数据,我们就可以在图标中看到一条动态的样条曲线。
样例代码演示了使用定时器,定时刷新在图表中显示样条曲线的数据,同时也演示了
QChart.setAnimationOptions()设置图表的动画显示方式。完整代码如下:
- import sys
- from PyQt5.QtCore import Qt, QTimer, QRandomGenerator
- from PyQt5.QtGui import QPainter, QPen
- from PyQt5.QtWidgets import QApplication, QMainWindow
- from PyQt5.QtChart import QChart, QChartView,QSplineSeries, QValueAxis
-
- class MyChart(QChart):
- def __init__(self, parent = None):
- super(MyChart, self).__init__(parent)
-
- self.series = None
- self.axisX = QValueAxis()
- self.axisY = QValueAxis()
- self.step = 0
- self.x = 5
- self.y = 1
-
- #创建一个定时器
- self.timer = QTimer()
- self.timer.timeout.connect(self.handleTimeout)
- self.timer.setInterval(500)
-
- self.series = QSplineSeries(self)
- redPen = QPen(Qt.red)
- redPen.setWidth(3)
- self.series.setPen(redPen)
- self.series.append(self.x, self.y)
-
- self.addSeries(self.series)
-
- self.addAxis(self.axisX, Qt.AlignBottom)
- self.addAxis(self.axisY, Qt.AlignLeft)
- self.series.attachAxis(self.axisX)
- self.series.attachAxis(self.axisY)
- self.axisX.setTickCount(5)
- self.axisX.setRange(0, 10)
- self.axisY.setRange(-5, 10)
-
- self.timer.start()
-
- def handleTimeout(self):
- x = self.plotArea().width() / self.axisX.tickCount()
- y = (self.axisX.max() - self.axisX.min()) / self.axisX.tickCount()
- self.x += y
- self.y = QRandomGenerator.global_().bounded(5) - 2.5
- self.series.append(self.x, self.y)
- self.scroll(x, 0)
- if self.x == 100:
- self.timer.stop()
-
-
- class DemoDynamicSpline(QMainWindow):
- def __init__(self, parent=None):
- super(DemoDynamicSpline, self).__init__(parent)
-
- # 设置窗口标题
- self.setWindowTitle('实战 Qt for Python: 动态样条曲线演示')
- # 设置窗口大小
- self.resize(480, 360)
-
- self.createChart()
-
- def createChart(self):
- chart = MyChart()
- chart.setTitle('动态样条曲线')
- chart.legend().hide()
- chart.setAnimationOptions(QChart.AllAnimations)
-
- chartView = QChartView(chart)
- chartView.setRenderHint(QPainter.Antialiasing)
- self.setCentralWidget(chartView)
-
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- window = DemoDynamicSpline()
- window.show()
- sys.exit(app.exec())
运行结果如下图:

动态样条曲线显示