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