class FlowChart(QChart): def __init__(self): super().__init__() self.series_list = [] self.axisX = QValueAxis() self.axisY = QValueAxis() self.axisPen = QPen(PyQt5.QtCore.Qt.red) self.axisPen.setWidth(4) self.axisX.setLinePen(self.axisPen) self.axisY.setLinePen(self.axisPen) self.axixBrush = QBrush(PyQt5.QtCore.Qt.green) self.axisX.setLabelsBrush(self.axixBrush) self.axisX.setGridLineVisible(True) self.axisY.setLabelsBrush(self.axixBrush) self.axisY.setGridLineVisible(True) self.axisY.setRange(0, 28) self.setAxisX(self.axisX) self.setAxisY(self.axisY) def add_xyseries(self, maxinterval, maxpoints=5000, type=QLineSeries): series = FlowSeries( maxinterval=maxinterval, maxpoints=maxpoints, type=type) self.addSeries(series.series) series.attachAxes(self.axisX, self.axisY) self.series_list.append(series) return series def set_yrange(self, ymin, ymax): self.axisY.setRange(ymin, ymax) def update(self): xmin = None xmax = None for s in self.series_list: r = s.range() if xmin is None or xmin > r[0]: xmin = r[0] if xmax is None or xmax < r[1]: xmax = r[1] self.axisX.setRange(xmin, xmax) for s in self.series_list: s.replace()
class StaticChart(QChart): def __init__(self): super().__init__() self.series_list = [] self.axisX = QValueAxis() self.axisY = QValueAxis() self.axisPen = QPen(PyQt5.QtCore.Qt.red) self.axisPen.setWidth(4) self.axisX.setLinePen(self.axisPen) self.axixBrush = QBrush(PyQt5.QtCore.Qt.green) self.axisX.setLabelsBrush(self.axixBrush) self.axisX.setGridLineVisible(True) self.setAxisX(self.axisX) self.setAxisY(self.axisY) def add_xyseries(self, type=StaticSeries): series = type() self.addSeries(series) series.attachAxis(self.axisX) series.attachAxis(self.axisY) self.series_list.append(series) return series def set_xrange(self, xmin, xmax): self.axisX.setRange(xmin, xmax) def set_yrange(self, ymin, ymax): self.axisY.setRange(ymin, ymax) def autoscale(self): xmax = ymax = float("-inf") xmin = ymin = float("+inf") for s in self.series_list: points = s.pointsVector() for p in points: if p.x() < xmin: xmin = p.x() if p.x() > xmax: xmax = p.x() if p.y() < ymin: ymin = p.y() if p.y() > ymax: ymax = p.y() self.set_xrange(xmin, xmax) self.set_yrange(ymin, ymax)
def __init__(self, parent=None): super().__init__(parent=parent) self.setpoint_temperature = None self.chart = QChart() self.chart.legend().hide() self.setChart( self.chart ) self.setRenderHint(QPainter.Antialiasing) self.chart.setPlotAreaBackgroundBrush( QBrush(Qt.black) ) self.chart.setPlotAreaBackgroundVisible( True ) self.setpointTemperatureSeries = QLineSeries( self.chart ) pen = self.setpointTemperatureSeries.pen() pen.setWidthF(2.) pen.setColor( Qt.green ) self.setpointTemperatureSeries.setPen( pen ) #self.setpointTemperatureSeries.setUseOpenGL( True ) self.chart.addSeries( self.setpointTemperatureSeries ) self.temperatureSeries = QLineSeries( self.chart ) pen = self.temperatureSeries.pen() pen.setWidthF(2.) pen.setColor( Qt.red ) self.temperatureSeries.setPen( pen ) #self.temperatureSeries.setUseOpenGL( True ) self.chart.addSeries( self.temperatureSeries ) self.number_of_samples_to_keep = 2 * 5 * 60 self.xMin = QDateTime.currentDateTime().toMSecsSinceEpoch() self.xMax = QDateTime.currentDateTime().toMSecsSinceEpoch() self.yMin = 400 self.yMax = 0 #self.chart.createDefaultAxes() #x_axis = QValueAxis() x_axis = QDateTimeAxis() x_axis.setTitleText( "Time" ) x_axis.setFormat("HH:mm:ss") self.chart.addAxis( x_axis, Qt.AlignBottom ) self.temperatureSeries.attachAxis( x_axis ) self.setpointTemperatureSeries.attachAxis( x_axis ) startDate = QDateTime.currentDateTime().addSecs( -5 * 60 ) endDate = QDateTime.currentDateTime().addSecs( 5 * 60 ) #startDate = QDateTime(QDate(2017, 1, 9), QTime(17, 25, 0)) #endDate = QDateTime(QDate(2017, 1, 9), QTime(17, 50, 0)) #self.chart.axisX().setRange( startDate, endDate ) #self.chart.axisX().setRange( 0, 100 ) y_axis = QValueAxis() y_axis.setTitleText( "Temperature (K)" ) self.chart.addAxis( y_axis, Qt.AlignLeft ) self.temperatureSeries.attachAxis( y_axis ) self.setpointTemperatureSeries.attachAxis( y_axis ) self.chart.axisY().setRange( 0, 400 ) #self.chart.axisY().setRange( 260., 290. ) self.temperatureSeries.pointAdded.connect( self.Rescale_Axes ) #self.setpointTemperatureSeries.pointAdded.connect( self.Rescale_Axes ) self.setRubberBand( QChartView.HorizontalRubberBand ) # Customize chart title font = QFont() font.setPixelSize(24); self.chart.setTitleFont(font); self.chart.setTitleBrush(QBrush(Qt.white)); ## Customize chart background #backgroundGradient = QLinearGradient() #backgroundGradient.setStart(QPointF(0, 0)); #backgroundGradient.setFinalStop(QPointF(0, 1)); #backgroundGradient.setColorAt(0.0, QColor(0x000147)); #backgroundGradient.setColorAt(1.0, QColor(0x000117)); #backgroundGradient.setCoordinateMode(QGradient.ObjectBoundingMode); #self.chart.setBackgroundBrush(backgroundGradient); transparent_background = QBrush(QColor(0,0,0,0)) self.chart.setBackgroundBrush( transparent_background ) # Customize axis label font labelsFont = QFont() labelsFont.setPixelSize(16); x_axis.setLabelsFont(labelsFont) y_axis.setLabelsFont(labelsFont) x_axis.setTitleFont(labelsFont) y_axis.setTitleFont(labelsFont) # Customize axis colors axisPen = QPen(QColor(0xd18952)) axisPen.setWidth(2) x_axis.setLinePen(axisPen) y_axis.setLinePen(axisPen) # Customize axis label colors axisBrush = QBrush(Qt.white) x_axis.setLabelsBrush(axisBrush) y_axis.setLabelsBrush(axisBrush) x_axis.setTitleBrush(axisBrush) y_axis.setTitleBrush(axisBrush)
class Chart(QChartView): def __init__(self): self.chart = QChart() QChartView.__init__(self, self.chart) self.axisX = QValueAxis() self.axisY = QValueAxis() self.xRange = [0, 100] self.yRange = [-100, 100] self.curve = [] self.scatterCurve = [] self.setBackgroundBrush(QColor('#D8D8D8')) self.setRenderHint(QPainter.Antialiasing) self.chart.setAnimationOptions(QChart.NoAnimation) self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chart.legend().setLabelColor(Qt.white) self.chart.legend().setMarkerShape(QLegend.MarkerShapeFromSeries) self.chart.setBackgroundBrush(QColor('#00004D')) penAxisGrid = QPen(QColor('#F2F2F2')) penAxisGrid.setWidthF(0.5) penAxisMinorGrid = QPen(QColor('#A4A4A4')) penAxisMinorGrid.setWidthF(0.3) self.axisX.setGridLinePen(penAxisGrid) self.axisX.setLinePen(penAxisGrid) self.axisY.setGridLinePen(penAxisGrid) self.axisY.setLinePen(penAxisGrid) self.axisX.setMinorGridLinePen(penAxisMinorGrid) self.axisY.setMinorGridLinePen(penAxisMinorGrid) self.axisX.setLabelsColor(Qt.white) self.axisY.setLabelsColor(Qt.white) self.axisX.setMinorTickCount(4) self.axisY.setMinorTickCount(4) self.axisX.setTitleBrush(Qt.white) self.axisY.setTitleBrush(Qt.white) self.axisX.setTitleText('Time') self.axisY.setTitleText('Signal Amplitude') self.axisX.setTickCount(11) self.axisY.setTickCount(11) self.axisX.setRange(self.xRange[0], self.xRange[1]) self.axisY.setRange(self.yRange[0], self.yRange[1]) def setAddSerie(self, name, color): self.curve.append(QLineSeries()) pen = self.curve[len(self.curve) - 1].pen() pen.setColor(QColor(color)) pen.setWidthF(2) self.curve[len(self.curve) - 1].setPen(pen) self.curve[len(self.curve) - 1].setName(name) self.chart.addSeries(self.curve[len(self.curve) - 1]) self.chart.setAxisX(self.axisX, self.curve[len(self.curve) - 1]) self.chart.setAxisY(self.axisY, self.curve[len(self.curve) - 1]) def setAddScatterSerie(self, color): self.scatterCurve.append(QScatterSeries()) pen = self.scatterCurve[len(self.scatterCurve) - 1].pen() pen.setColor(QColor(color)) pen.setWidthF(1) self.scatterCurve[len(self.scatterCurve) - 1].setPen(pen) self.scatterCurve[len(self.scatterCurve) - 1].setColor(QColor(color)) self.scatterCurve[len(self.scatterCurve) - 1].setMarkerSize(10) self.chart.addSeries(self.scatterCurve[len(self.scatterCurve) - 1]) self.chart.setAxisX(self.axisX, self.scatterCurve[len(self.scatterCurve) - 1]) self.chart.setAxisY(self.axisY, self.scatterCurve[len(self.scatterCurve) - 1]) def setDataChartScatter(self, xData, yData1, yData2): if xData > self.xRange[1]: addValue = xData - self.xRange[1] if self.xRange[0] is not 0: self.xRange[0] = self.xRange[0] + addValue self.xRange[1] = self.xRange[1] + addValue self.axisX.setRange(self.xRange[0], self.xRange[1]) self.curve[0].append(xData, yData1) self.curve[1].append(xData, yData2) self.scatterCurve[0].append(xData, yData1) self.scatterCurve[1].append(xData, yData2) def setDataChart(self, xData, yData1, yData2): if xData > self.xRange[1]: addValue = xData - self.xRange[1] if self.xRange[0] is not 0: self.xRange[0] = self.xRange[0] + addValue self.xRange[1] = self.xRange[1] + addValue self.axisX.setRange(self.xRange[0], self.xRange[1]) self.curve[0].append(xData, yData1) self.curve[1].append(xData, yData2) def setRangeY(self, yRange, autoscale): if autoscale: if yRange[0] == 0 and yRange[1] == 0: yRange[0] = -0.50 yRange[1] = 0.50 elif yRange[0] == 0: yRange[0] = -0.10 yRange[1] = yRange[1] * 1.10 elif yRange[1] == 0: yRange[0] = yRange[0] * 1.10 yRange[1] = 0.10 else: if yRange[0] < 0: yRange[0] = yRange[0] * 1.10 else: yRange[0] = yRange[0] - (yRange[0] * 0.10) if yRange[1] < 0: yRange[1] = yRange[1] - (yRange[1] * 0.10) else: yRange[1] = yRange[1] * 1.10 self.axisY.setRange(yRange[0], yRange[1]) else: self.axisY.setRange(yRange[0], yRange[1]) def setRangeX(self, xRange): self.axisX.setRange(xRange[0], xRange[1]) def getRangeX(self): return self.xRange def setAxisXName(self, name): self.axisX.setTitleText(name) def setAxisYName(self, name): self.axisY.setTitleText(name) def setAxisXTickCount(self, tick): self.axisX.setTickCount(tick) def setAxisYTickCount(self, tick): self.axisY.setTickCount(tick) def initSerie(self): self.curve.clear() def initSeries(self): self.curve[0].clear() self.curve[1].clear()