1#!/usr/bin/env python 2 3 4############################################################################# 5## 6## Copyright (C) 2013 Riverbank Computing Limited 7## Copyright (C) 2013 Digia Plc 8## All rights reserved. 9## 10## This file is part of the examples of PyQtChart. 11## 12## $QT_BEGIN_LICENSE$ 13## Licensees holding valid Qt Commercial licenses may use this file in 14## accordance with the Qt Commercial License Agreement provided with the 15## Software or, alternatively, in accordance with the terms contained in 16## a written agreement between you and Digia. 17## $QT_END_LICENSE$ 18## 19############################################################################# 20 21 22import sys 23 24from PyQt5.QtChart import (QAreaSeries, QChart, QChartView, QLineSeries, 25 QPolarChart, QScatterSeries, QSplineSeries, QValueAxis) 26from PyQt5.QtCore import Qt 27from PyQt5.QtGui import QBrush, QColor, QPainter 28from PyQt5.QtWidgets import QApplication, QMainWindow 29 30 31class ChartView(QChartView): 32 33 def keyPressEvent(self, event): 34 key = event.key() 35 36 if key == Qt.Key_Plus: 37 self.chart().zoomIn() 38 elif key == Qt.Key_Minus: 39 self.chart().zoomOut() 40 elif key == Qt.Key_Left: 41 self.chart().scroll(-1.0, 0) 42 elif key == Qt.Key_Right: 43 self.chart().scroll(1.0, 0) 44 elif key == Qt.Key_Up: 45 self.chart().scroll(0, 1.0) 46 elif key == Qt.Key_Down: 47 self.chart().scroll(0, -1.0) 48 elif key == Qt.Key_Space: 49 self.switchChartType() 50 else: 51 super(ChartView, self).keyPressEvent(event) 52 53 def switchChartType(self): 54 oldChart = self.chart() 55 56 if oldChart.chartType() == QChart.ChartTypeCartesian: 57 newChart = QPolarChart() 58 else: 59 newChart = QChart() 60 61 seriesList = oldChart.series() 62 axisList = oldChart.axes() 63 axisRanges = [(axis.min(), axis.max()) for axis in axisList] 64 65 for series in seriesList: 66 oldChart.removeSeries(series) 67 68 for axis in axisList: 69 oldChart.removeAxis(axis) 70 if isinstance(newChart, QPolarChart): 71 newChart.addAxis(axis, QPolarChart.axisPolarOrientation(axis)) 72 else: 73 newChart.addAxis(axis, axis.alignment()) 74 75 for series in seriesList: 76 newChart.addSeries(series) 77 for axis in axisList: 78 series.attachAxis(axis) 79 80 for (min, max), axis in zip(axisRanges, axisList): 81 axis.setRange(min, max) 82 83 newChart.setTitle(oldChart.title()) 84 self.setChart(newChart) 85 86 87app = QApplication(sys.argv) 88 89ANGULAR_MIN = -100 90ANGULAR_MAX = 100 91 92RADIAL_MIN = -100 93RADIAL_MAX = 100 94 95series1 = QScatterSeries() 96series1.setName("scatter") 97for i in range(ANGULAR_MIN, ANGULAR_MAX + 1, 10): 98 series1.append(i, (float(i) / RADIAL_MAX) * RADIAL_MAX + 8.0) 99 100series2 = QSplineSeries() 101series2.setName("spline") 102for i in range(ANGULAR_MIN, ANGULAR_MAX + 1, 10): 103 series2.append(i, (float(i) / RADIAL_MAX) * RADIAL_MAX) 104 105series3 = QLineSeries() 106series3.setName("star outer") 107ad = (ANGULAR_MAX - ANGULAR_MIN) / 8.0 108rd = (RADIAL_MAX - RADIAL_MIN) / 3.0 * 1.3 109series3.append(ANGULAR_MIN, RADIAL_MAX) 110series3.append(ANGULAR_MIN + ad*1, RADIAL_MIN + rd) 111series3.append(ANGULAR_MIN + ad*2, RADIAL_MAX) 112series3.append(ANGULAR_MIN + ad*3, RADIAL_MIN + rd) 113series3.append(ANGULAR_MIN + ad*4, RADIAL_MAX) 114series3.append(ANGULAR_MIN + ad*5, RADIAL_MIN + rd) 115series3.append(ANGULAR_MIN + ad*6, RADIAL_MAX) 116series3.append(ANGULAR_MIN + ad*7, RADIAL_MIN + rd) 117series3.append(ANGULAR_MIN + ad*8, RADIAL_MAX) 118 119series4 = QLineSeries() 120series4.setName("star inner") 121ad = (ANGULAR_MAX - ANGULAR_MIN) / 8.0 122rd = (RADIAL_MAX - RADIAL_MIN) / 3.0 123series4.append(ANGULAR_MIN, RADIAL_MAX) 124series4.append(ANGULAR_MIN + ad*1, RADIAL_MIN + rd) 125series4.append(ANGULAR_MIN + ad*2, RADIAL_MAX) 126series4.append(ANGULAR_MIN + ad*3, RADIAL_MIN + rd) 127series4.append(ANGULAR_MIN + ad*4, RADIAL_MAX) 128series4.append(ANGULAR_MIN + ad*5, RADIAL_MIN + rd) 129series4.append(ANGULAR_MIN + ad*6, RADIAL_MAX) 130series4.append(ANGULAR_MIN + ad*7, RADIAL_MIN + rd) 131series4.append(ANGULAR_MIN + ad*8, RADIAL_MAX) 132 133series5 = QAreaSeries() 134series5.setName("star area") 135series5.setUpperSeries(series3) 136series5.setLowerSeries(series4) 137series5.setOpacity(0.5) 138 139chart = QPolarChart() 140chart.addSeries(series1) 141chart.addSeries(series2) 142chart.addSeries(series3) 143chart.addSeries(series4) 144chart.addSeries(series5) 145chart.setTitle("Use arrow keys to scroll, +/- to zoom, and space to switch chart type.") 146 147angularAxis = QValueAxis() 148angularAxis.setTickCount(9) 149angularAxis.setLabelFormat('%.1f') 150angularAxis.setShadesVisible(True) 151angularAxis.setShadesBrush(QBrush(QColor(249, 249, 255))) 152chart.addAxis(angularAxis, QPolarChart.PolarOrientationAngular) 153 154radialAxis = QValueAxis() 155radialAxis.setTickCount(9) 156radialAxis.setLabelFormat('%d') 157chart.addAxis(radialAxis, QPolarChart.PolarOrientationRadial) 158 159series1.attachAxis(radialAxis) 160series1.attachAxis(angularAxis) 161series2.attachAxis(radialAxis) 162series2.attachAxis(angularAxis) 163series3.attachAxis(radialAxis) 164series3.attachAxis(angularAxis) 165series4.attachAxis(radialAxis) 166series4.attachAxis(angularAxis) 167series5.attachAxis(radialAxis) 168series5.attachAxis(angularAxis) 169 170radialAxis.setRange(RADIAL_MIN, RADIAL_MAX) 171angularAxis.setRange(ANGULAR_MIN, ANGULAR_MAX) 172 173chartView = ChartView() 174chartView.setChart(chart) 175chartView.setRenderHint(QPainter.Antialiasing) 176 177window = QMainWindow() 178window.setCentralWidget(chartView) 179window.resize(800, 600) 180window.show() 181 182sys.exit(app.exec_()) 183