让图表动起来
在很多时候,需要对图表里的一些元素进行动态显示,不仅可以使图表更生动,更形象地展示数据变化趋势,还有在数据实时采集的时候,也需要不间断地显示新采集的数,这时候图表中的数据序列是动态的,图表也是动态显示的。
在QChart中,可以使用
QChart.setAnimationOptions()方法对图表中的各种元素进行动画显示:
- QChart.GridAxisAnimations: 图表中的网格和坐标轴以动画方式显示。
- QChart.SeriesAnimations:图表中的图形序列以动画方式显示。
- QChart.AllAnimations:上述两种情况都以动画方式显示。
另外,一定时间间隔刷新图表序列的数据,就可以在图标中展现动态的图形序列。比如,在下面的示例中,使用定时器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())
运行结果如下图:
动态样条曲线显示
本文知识点
- 使用QChart.setAnimationOptions()设置图表的动画显示方式;
- 使用QTimer动态更新图形序列数据,动态显示图形。