class ChartWidget(QWidget): def __init__(self, parent, quotes, trades, data_range, currency_name): QWidget.__init__(self, parent) self.setMinimumWidth(600) self.setMinimumHeight(400) self.quotes_series = QLineSeries() for point in quotes: # Conversion to 'float' in order not to get 'int' overflow on some platforms self.quotes_series.append(float(point['timestamp']), point['quote']) self.trade_series = QScatterSeries() for point in trades: # Conversion to 'float' in order not to get 'int' overflow on some platforms self.trade_series.append(float(point['timestamp']), point['price']) self.trade_series.setMarkerSize(5) self.trade_series.setBorderColor(CustomColor.LightRed) self.trade_series.setBrush(CustomColor.DarkRed) axisX = QDateTimeAxis() axisX.setTickCount(11) axisX.setRange(QDateTime().fromSecsSinceEpoch(data_range[0]), QDateTime().fromSecsSinceEpoch(data_range[1])) axisX.setFormat("yyyy/MM/dd") axisX.setLabelsAngle(-90) axisX.setTitleText("Date") axisY = QValueAxis() axisY.setTickCount(11) axisY.setRange(data_range[2], data_range[3]) axisY.setTitleText("Price, " + currency_name) self.chartView = QChartView() self.chartView.chart().addSeries(self.quotes_series) self.chartView.chart().addSeries(self.trade_series) self.chartView.chart().addAxis(axisX, Qt.AlignBottom) self.chartView.chart().setAxisX(axisX, self.quotes_series) self.chartView.chart().setAxisX(axisX, self.trade_series) self.chartView.chart().addAxis(axisY, Qt.AlignLeft) self.chartView.chart().setAxisY(axisY, self.quotes_series) self.chartView.chart().setAxisY(axisY, self.trade_series) self.chartView.chart().legend().hide() self.chartView.setViewportMargins(0, 0, 0, 0) self.chartView.chart().layout().setContentsMargins( 0, 0, 0, 0) # To remove extra spacing around chart self.chartView.chart().setBackgroundRoundness( 0) # To remove corner rounding self.chartView.chart().setMargins(QMargins( 0, 0, 0, 0)) # Allow chart to fill all space self.layout = QHBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) # Remove extra space around layout self.layout.addWidget(self.chartView) self.setLayout(self.layout)
class Widget(QWidget): def __init__(self): QWidget.__init__(self) self.setMinimumSize(800, 600) self.donuts = [] self.chart_view = QChartView() self.chart_view.setRenderHint(QPainter.Antialiasing) self.chart = self.chart_view.chart() self.chart.legend().setVisible(False) self.chart.setTitle("Nested donuts demo") self.chart.setAnimationOptions(QChart.AllAnimations) self.min_size = 0.1 self.max_size = 0.9 self.donut_count = 5 self.setup_donuts() # create main layout self.main_layout = QGridLayout(self) self.main_layout.addWidget(self.chart_view, 1, 1) self.setLayout(self.main_layout) self.update_timer = QTimer(self) self.update_timer.timeout.connect(self.update_rotation) self.update_timer.start(1250) def setup_donuts(self): for i in range(self.donut_count): donut = QPieSeries() slccount = randrange(3, 6) for j in range(slccount): value = randrange(100, 200) slc = QPieSlice(str(value), value) slc.setLabelVisible(True) slc.setLabelColor(Qt.white) slc.setLabelPosition(QPieSlice.LabelInsideTangential) # Connection using an extra parameter for the slot slc.hovered[bool].connect(partial(self.explode_slice, slc=slc)) donut.append(slc) size = (self.max_size - self.min_size) / self.donut_count donut.setHoleSize(self.min_size + i * size) donut.setPieSize(self.min_size + (i + 1) * size) self.donuts.append(donut) self.chart_view.chart().addSeries(donut) def update_rotation(self): for donut in self.donuts: phase_shift = randrange(-50, 100) donut.setPieStartAngle(donut.pieStartAngle() + phase_shift) donut.setPieEndAngle(donut.pieEndAngle() + phase_shift) def explode_slice(self, exploded, slc): if exploded: self.update_timer.stop() slice_startangle = slc.startAngle() slice_endangle = slc.startAngle() + slc.angleSpan() donut = slc.series() idx = self.donuts.index(donut) for i in range(idx + 1, len(self.donuts)): self.donuts[i].setPieStartAngle(slice_endangle) self.donuts[i].setPieEndAngle(360 + slice_startangle) else: for donut in self.donuts: donut.setPieStartAngle(0) donut.setPieEndAngle(360) self.update_timer.start() slc.setExploded(exploded)