qchart 图表_实战PyQt5: 158-QChart图表之线条缩放显示

线条缩放

在数据量比较的折线图或者曲线图,受图表本身显示区域大小的限制,不能精细地显示某一小块区域的数据变化,QChartView提供了方法setRubberBand()可以实现一种类似放大镜的功能,可以将局部区域的数据放大到整个图表显示区域中显示。这样就可以方便地实现在图表中对图形序列的局部放大观察。

线条缩放显示样例

示例显示了如何使用鼠标利用QRubberBand 来创建自定义的缩放效果。完整代码如下:

import sys,mathfrom PyQt5.QtCore import Qt, QTimer, QRandomGenerator, QEvent, QPointFfrom PyQt5.QtGui import QPainter, QPenfrom PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsViewfrom PyQt5.QtChart import QChart, QChartView,QLineSeries, QValueAxis class MyChartView(QChartView): def __init__(self, chart, parent = None): super(MyChartView, self).__init__(chart, parent) self.isTouching = False self.setRubberBand(QChartView.RectangleRubberBand) def keyPressEvent(self, event): if event.key() == Qt.Key_Plus: self.chart().zoomIn() elif event.key() == Qt.Key_Minus: self.chart().zoomOut() elif event.key() == Qt.Key_Left: self.chart().scroll(-10, 0) elif event.key() == Qt.Key_Right: self.chart().scroll(10, 0) elif event.key() == Qt.Key_Up: self.chart().scroll(0, 10) elif event.key() == Qt.Key_Down: self.chart().scroll(0, -10) else: QGraphicsView.keyPressEvent(self, event) class DemoZoomLineChart(QMainWindow): def __init__(self, parent=None): super(DemoZoomLineChart, self).__init__(parent) # 设置窗口标题 self.setWindowTitle('实战 Qt for Python: 线条缩放演示') # 设置窗口大小 self.resize(480, 360) self.createChart() def createChart(self): series = QLineSeries() for i in range(500): pnt = QPointF(i, math.sin(math.pi * i / 50) * 100 + QRandomGenerator.global_().bounded(20)) series.append(pnt) chart = QChart() chart.setTitle('线条缩放显示') chart.addSeries(series) chart.setAnimationOptions(QChart.SeriesAnimations) chart.legend().hide() chart.createDefaultAxes() chartView =MyChartView(chart) chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chartView) if __name__ == '__main__': app = QApplication(sys.argv) window = DemoZoomLineChart() window.show() sys.exit(app.exec())

运行效果如下图:

曲线缩放演示

本文知识点使用QRubberBand 创建自定义的图表缩放效果。


版权声明:本文为weixin_39524959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。