class ChartView(QChartView,QChart): def __init__(self, *args, **kwargs): super(ChartView, self).__init__(*args, **kwargs) self.resize(800, 600) self.setRenderHint(QPainter.Antialiasing) # 抗锯齿 self.chart_init() self.timer_init() def timer_init(self): #使用QTimer,2秒触发一次,更新数据 self.timer = QTimer(self) self.timer.timeout.connect(self.drawLine) self.timer.start(100) def chart_init(self): self.chart = QChart() self.series = QScatterSeries() #设置曲线名称 self.series.setName("实时数据") self.series.setColor(QColor(255,0,0)) self.series.setMarkerSize(20.0) self.series.setPen(QPen(QtCore.Qt.PenStyle.NoPen)) #把曲线添加到QChart的实例中 self.chart.addSeries(self.series) #声明并初始化X轴,Y轴 self.dtaxisX = QDateTimeAxis() self.vlaxisY = QValueAxis() #设置坐标轴显示范围 self.dtaxisX.setMin(QDateTime.currentDateTime().addSecs(-300*1)) self.dtaxisX.setMax(QDateTime.currentDateTime().addSecs(0)) self.vlaxisY.setMin(0) self.vlaxisY.setMax(1500) #设置X轴时间样式 self.dtaxisX.setFormat("MM月dd hh:mm:ss") #设置坐标轴上的格点 self.dtaxisX.setTickCount(6) self.vlaxisY.setTickCount(11) #设置坐标轴名称 self.dtaxisX.setTitleText("时间") self.vlaxisY.setTitleText("量程") #设置网格不显示` #把坐标轴添加到chart中 self.chart.addAxis(self.dtaxisX,Qt.AlignBottom) self.chart.addAxis(self.vlaxisY,Qt.AlignLeft) #把曲线关联到坐标轴 self.series.attachAxis(self.dtaxisX) self.series.attachAxis(self.vlaxisY) self.setChart(self.chart) def drawLine(self): #获取当前时间 bjtime = QDateTime.currentDateTime() #更新X轴坐标 self.dtaxisX.setMin(QDateTime.currentDateTime().addSecs(-300*1)) self.dtaxisX.setMax(QDateTime.currentDateTime().addSecs(0)) #当曲线上的点超出X轴的范围时,移除最早的点 if(self.series.count()>149): self.series.removePoints(0,self.series.count()-149) #产生随即数 yint = random.randint(0,1500) #添加数据到曲线末端 self.series.append(bjtime.toMSecsSinceEpoch(),yint)
def update_particles(particles): animation_chart = QChart() reals = QScatterSeries() pen_reals = reals.pen() pen_reals.setBrush(QtGui.QColor("white")) reals.setMarkerSize(5) reals.setColor(QtGui.QColor("red")) reals.setPen(pen_reals) for particle in particles: reals.append(particle, 0) animation_chart.addSeries(reals) animation_chart.setBackgroundBrush(QtGui.QColor(41, 43, 47)) animation_chart.createDefaultAxes() animation_chart.legend().hide() animation_chart.setContentsMargins(-10, -10, -10, -10) animation_chart.layout().setContentsMargins(0, 0, 0, 0) animation_chart.axisX().setTickCount(17) animation_chart.axisY().setTickCount(3) animation_chart.axisX().setLabelsColor(QtGui.QColor("white")) animation_chart.axisX().setGridLineColor(QtGui.QColor("grey")) animation_chart.axisX().setRange(-4, 12) animation_chart.axisY().setRange(-1, 1) animation_chart.axisY().setLabelsColor(QtGui.QColor("white")) animation_chart.axisY().setGridLineColor(QtGui.QColor("grey")) form.widget_animation.setChart(animation_chart)
def setupChart(self): """Set up the GUI's series and chart.""" # Collect x and y data values from the CSV file x_values, y_values = self.loadCSVFile() # Get the largest x and y values; Used for setting the chart's axes x_max, y_max = max(x_values), max(y_values) # Create numpy arrays from the x and y values x_values = np.array(x_values) y_values = np.array(y_values) # Calculate the regression line coefficients = linearRegression(x_values, y_values) # Create chart object chart = QChart() chart.setTitle("Auto Insurance for Geographical Zones in Sweden") chart.legend().hide() # Create scatter series and add points to the series scatter_series = QScatterSeries() scatter_series.setName("DataPoints") scatter_series.setMarkerSize(9.0) scatter_series.hovered.connect(self.displayPointInfo) for value in range(0, self.row_count - 1): scatter_series.append(x_values[value], y_values[value]) scatter_series.setBorderColor(QColor('#000000')) # Create line series and add points to the series line_series = QLineSeries() line_series.setName("RegressionLine") # Calculate the regression line for x in x_values: y_pred = coefficients[0] + coefficients[1] * x line_series.append(x, y_pred) # Add both series to the chart and create x and y axes chart.addSeries(scatter_series) chart.addSeries(line_series) chart.createDefaultAxes() axis_x = chart.axes(Qt.Horizontal) axis_x[0].setTitleText("Number of Claims") axis_x[0].setRange(0, x_max) axis_x[0].setLabelFormat("%i") axis_y = chart.axes(Qt.Vertical) axis_y[0].setTitleText( "Total Payment in Swedish Kronor (in thousands)") axis_y[0].setRange(0, y_max + 20) # Create QChartView object for displaying the chart chart_view = QChartView(chart) v_box = QVBoxLayout() v_box.addWidget(chart_view) self.setLayout(v_box)
def __drawParetoChart(self): def make_noise(value, noise_size): return value + (noise_size / -2 + noise_size * random.random()) self.__pareto_chart.removeAllSeries() series1 = QScatterSeries() series1.setMarkerShape(QScatterSeries.MarkerShapeCircle) series1.setMarkerSize(5) series1.append(make_noise(23, 2), make_noise(25, 2)) series1.setBrush(QColor(Qt.red)) self.__pareto_chart.addSeries(series1) self.__axisy.setRange(0.0, 100.0) series3 = QScatterSeries() series3.setName("Точка утопии") series3.setMarkerShape(QScatterSeries.MarkerShapeCircle) series3.setMarkerSize(10) series3.append(make_noise(2, 0.5), make_noise(23, 2)) self.__pareto_chart.addSeries(series3) series2 = QScatterSeries() series2.setName("Оптимальный") series2.setMarkerShape(QScatterSeries.MarkerShapeCircle) series2.setMarkerSize(7) series2.append(make_noise(2, 0.5), make_noise(45, 4)) self.__pareto_chart.addSeries(series2) self.__pareto_chart.setAxisX(self.__axisx, series1) self.__pareto_chart.setAxisY(self.__axisy, series1) self.__pareto_chart.setAxisX(self.__axisx, series2) self.__pareto_chart.setAxisY(self.__axisy, series2) self.__pareto_chart.setAxisX(self.__axisx, series3) self.__pareto_chart.setAxisY(self.__axisy, series3)
def setData(self, timeData, valueData, chartTypes="Bar"): axisX = QDateTimeAxis() axisX.setFormat("yyyy-MM-dd") if self.chartTypes == "Bar": # Clear all series self.clearAll() self.zoomSeries = QLineSeries(self.chart()) barSeries = QBarSeries(self.chart()) barset = QBarSet("data") barSeries.setBarWidth(0.8) barSeries.append(barset) for td, vd in zip(timeData, valueData): self.zoomSeries.append(td.toMSecsSinceEpoch(), vd) barset.append(valueData) self.zoomSeries.hide() self.chart().addSeries(self.zoomSeries) self.chart().addSeries(barSeries) self.chart().setAxisY(QValueAxis(), self.zoomSeries) axisX.setRange(min(timeData), max(timeData)) self.chart().setAxisX(axisX, self.zoomSeries) elif self.chartTypes == "Scatter": # Clear all series self.clearAll() self.zoomSeries = QLineSeries(self.chart()) scattSeries = QScatterSeries(self.chart()) scattSeries.setMarkerSize(8) for td, vd in zip(timeData, valueData): self.zoomSeries.append(td.toMSecsSinceEpoch(), vd) scattSeries.append(td.toMSecsSinceEpoch(), vd) self.zoomSeries.hide() self.chart().addSeries(self.zoomSeries) self.chart().addSeries(scattSeries) self.chart().setAxisY(QValueAxis(), self.zoomSeries) axisX.setRange(min(timeData), max(timeData)) self.chart().setAxisX(axisX, self.zoomSeries) elif self.chartTypes in ["Line", "PLine"]: self.clearAll() if self.chartTypes == "Line": self.zoomSeries = QLineSeries(self.chart()) else: self.zoomSeries = QSplineSeries(self.chart()) for td, vd in zip(timeData, valueData): self.zoomSeries.append(td.toMSecsSinceEpoch(), vd) self.chart().addSeries(self.zoomSeries) self.chart().setAxisY(QValueAxis(), self.zoomSeries) axisX.setRange(min(timeData), max(timeData)) self.chart().setAxisX(axisX, self.zoomSeries) elif self.chartTypes == "Area": self.clearAll() self.zoomSeries = QLineSeries() self.zoomSeries.setColor(QColor("#666666")) for td, vd in zip(timeData, valueData): self.zoomSeries.append(td.toMSecsSinceEpoch(), vd) areaSeries = QAreaSeries(self.zoomSeries, None) self.chart().addSeries(self.zoomSeries) self.chart().addSeries(areaSeries) self.chart().setAxisY(QValueAxis(), areaSeries) axisX.setRange(min(timeData), max(timeData)) self.chart().setAxisX(axisX, areaSeries) self.zoomSeries.hide() self.mintimeData = min(timeData) self.maxtimeData = max(timeData) self.BtnsWidget.dateRangeEdit.setDateRange([ self.mintimeData.toString("yyyy-MM-dd"), self.maxtimeData.toString("yyyy-MM-dd"), ]) self.updateView()
def __createChart(self): ##创建图表 chart = QChart() #创建 Chart ## chart.setTitle("简单函数曲线") chart.legend().setVisible(True) self.chartView.setChart(chart) #Chart添加到chartView pen=QPen() pen.setWidth(2) ##========LineSeries折线 和 ScatterSeries散点 seriesLine = QLineSeries() seriesLine.setName("LineSeries折线") seriesLine.setPointsVisible(False) #数据点不可见 pen.setColor(Qt.red) seriesLine.setPen(pen) seriesLine.hovered.connect(self.do_series_hovered) #信号 hovered seriesLine.clicked.connect(self.do_series_clicked) #信号 clicked chart.addSeries(seriesLine) #添加到chart seriesLinePoint = QScatterSeries() #散点序列 seriesLinePoint.setName("ScatterSeries散点") shape=QScatterSeries.MarkerShapeCircle #MarkerShapeRectangle seriesLinePoint.setMarkerShape(shape) #散点形状,只有2种 seriesLinePoint.setBorderColor(Qt.yellow) seriesLinePoint.setBrush(QBrush(Qt.red)) seriesLinePoint.setMarkerSize(10) #散点大小 seriesLinePoint.hovered.connect(self.do_series_hovered) #信号 hovered seriesLinePoint.clicked.connect(self.do_series_clicked) #信号 clicked chart.addSeries(seriesLinePoint) #添加到chart ##======== SplineSeries 曲线和 QScatterSeries 散点 seriesSpLine = QSplineSeries() seriesSpLine.setName("SplineSeries曲线") seriesSpLine.setPointsVisible(False) #数据点不可见 pen.setColor(Qt.blue) seriesSpLine.setPen(pen) seriesSpLine.hovered.connect(self.do_series_hovered) #信号 hovered seriesSpLine.clicked.connect(self.do_series_clicked) #信号 clicked seriesSpPoint = QScatterSeries() #散点序列 seriesSpPoint.setName("QScatterSeries") shape=QScatterSeries.MarkerShapeRectangle #MarkerShapeCircle seriesSpPoint.setMarkerShape(shape) #散点形状,只有2种 seriesSpPoint.setBorderColor(Qt.green) seriesSpPoint.setBrush(QBrush(Qt.blue)) seriesSpPoint.setMarkerSize(10) #散点大小 seriesSpPoint.hovered.connect(self.do_series_hovered) #信号 hovered seriesSpPoint.clicked.connect(self.do_series_clicked) #信号 clicked chart.addSeries(seriesSpLine) chart.addSeries(seriesSpPoint) ## 创建缺省坐标轴 chart.createDefaultAxes() #创建缺省坐标轴并与序列关联 chart.axisX().setTitleText("time(secs)") chart.axisX().setRange(0,10) chart.axisX().applyNiceNumbers() chart.axisY().setTitleText("value") chart.axisY().setRange(-2,2) chart.axisY().applyNiceNumbers() for marker in chart.legend().markers(): #QLegendMarker类型列表 marker.clicked.connect(self.do_LegendMarkerClicked)
class Window(QMainWindow): def __init__(self, landmarkPoints, allPoints, threadEvent): super().__init__() self.title = "Lidar data points" #self.queue = queue self.color = Qt.darkRed self.lmrkPoints = landmarkPoints self.allPoints = allPoints self.event = threadEvent self.left = 500 self.top = 500 self.height = 480 self.width = 640 self.count = 0 self.time = 0 self.label = QLabel(self) self.lmrkBox = QCheckBox("Landmark points", self) self.ptsBox = QCheckBox("Data points", self) self.boxArea = QWidget() self.mainLayout = QGridLayout() self.mainLayout.addWidget(self.lmrkBox, 0, 0) self.mainLayout.addWidget(self.ptsBox, 1, 0) self.mainLayout.setVerticalSpacing(5) self.boxArea.setLayout(self.mainLayout) crote = QDockWidget("Hide", self) crote.setWidget(self.boxArea) self.addDockWidget(Qt.LeftDockWidgetArea, crote) dock = QDockWidget("", self) dock.setWidget(self.label) self.addDockWidget(Qt.LeftDockWidgetArea, dock) self.chart = QChart() self.config_axis() self.series = QScatterSeries(self.chart) self.allSeries = QScatterSeries(self.chart) self.config_series() #self.update() self.timer = QTimer(self) self.view = QChartView(self.chart) self.setCentralWidget( self.view ) # It is needed to create to view because the CentralWidget needs to be a QWidget, and a QChart is not so. self.initWindow() def config_series(self): self.series.setName("Landmark Points") self.allSeries.setName("Data Points") lmrkPen = self.series.pen() pen = self.allSeries.pen() lmrkPen.setWidthF(.2) pen.setWidthF(.2) self.series.setPen(lmrkPen) self.allSeries.setPen(pen) self.series.setColor(Qt.red) self.allSeries.setColor(Qt.blue) self.series.setMarkerShape(1) # 1 - rectangle; 0 - circle # for good visualization, the landmark points should be bigger than normal points self.series.setMarkerSize(8) self.allSeries.setMarkerSize(5) self.label.move(15, 15) def config_axis(self): self.xAxis = QValueAxis() self.yAxis = QValueAxis() self.xAxis.setRange(-XRANGE, XRANGE) self.xAxis.setTitleText("Eixo x") self.yAxis.setRange(-YRANGE, YRANGE) self.yAxis.setTitleText("Eixo y") self.chart.addAxis(self.xAxis, Qt.AlignBottom) self.chart.addAxis(self.yAxis, Qt.AlignLeft) def update(self): self.event.wait() start = time.time() self.label.setText("FPS: {:.2f}".format(1 / (time.time() - self.time))) self.time = time.time() if self.count == 0 and self.lmrkPoints != []: self.series.append(self.lmrkPoints[0][:]) self.allSeries.append(self.allPoints[0][:]) del self.lmrkPoints[:] del self.allPoints[:] self.count = 1 elif self.lmrkPoints != []: self.series.replace(self.lmrkPoints[0][:]) self.allSeries.replace(self.allPoints[0][:]) del self.lmrkPoints[:] del self.allPoints[:] end = time.time() self.event.clear() def hide_show_points(self): self.series.setVisible(not self.series.isVisible()) def hide_show_all_points(self): self.allSeries.setVisible(not self.allSeries.isVisible()) def initWindow(self): print("queue inside myWindow: {}".format(self.lmrkPoints)) self.setGeometry(self.left, self.top, self.width, self.height) self.setWindowTitle(self.title) self.chart.addSeries(self.series) self.chart.addSeries(self.allSeries) self.series.attachAxis(self.xAxis) self.series.attachAxis(self.yAxis) self.allSeries.attachAxis(self.xAxis) self.allSeries.attachAxis(self.yAxis) self.timer.timeout.connect(self.update) self.lmrkBox.stateChanged.connect(self.hide_show_points) self.ptsBox.stateChanged.connect(self.hide_show_all_points) self.timer.start(0) self.show()
def run_evolution(): range_a = float(str(form.input_a.text())) range_b = float(str(form.input_b.text())) precision = int(str(form.input_d.text())) generations_number = int(str(form.input_t.text())) app.setOverrideCursor(QtCore.Qt.WaitCursor) best_reals, best_binary, best_fxs, local_fxs, _, _ = evolution(range_a, range_b, precision, generations_number, form.checkBox.isChecked()) form.best_table.item(1,0).setText(str(best_reals[len(local_fxs)-1])) form.best_table.item(1,1).setText(''.join(map(str, best_binary[len(local_fxs)-1]))) form.best_table.item(1,2).setText(str(best_fxs[len(local_fxs)-1])) chart = QChart() bests = QLineSeries() pen_best = bests.pen() pen_best.setWidth(1) pen_best.setBrush(QtGui.QColor("red")) bests.setPen(pen_best) for i in range(0, len(local_fxs)): if len(local_fxs[i]) - 1 == 0: fxs = QScatterSeries() fxs.append(i + 0.99, local_fxs[i][0]) pen = fxs.pen() color = QtGui.QColor(random.randint(50,255), random.randint(50,255), random.randint(50,255)) fxs.setColor(color) pen.setColor(color) fxs.setPen(pen) fxs.setMarkerSize(5) else: fxs = QLineSeries() tick = 1 / (len(local_fxs[i]) - 1) for j in range(len(local_fxs[i])): fxs.append(i + j * tick, local_fxs[i][j]) pen = fxs.pen() pen.setWidth(1) pen.setBrush(QtGui.QColor(random.randint(50,255), random.randint(50,255), random.randint(50,255))) fxs.setPen(pen) bests.append(i+1, best_fxs[i]) chart.addSeries(fxs) chart.addSeries(bests) chart.setBackgroundBrush(QtGui.QColor(41, 43, 47)) chart.createDefaultAxes() chart.legend().hide() chart.setContentsMargins(-10, -10, -10, -10) chart.layout().setContentsMargins(0, 0, 0, 0) chart.axisX().setTickCount(11) chart.axisX().setLabelsColor(QtGui.QColor("white")) chart.axisX().setGridLineColor(QtGui.QColor("grey")) chart.axisX().setLabelFormat("%i") chart.axisY().setRange(-2,2) chart.axisY().setLabelsColor(QtGui.QColor("white")) chart.axisY().setGridLineColor(QtGui.QColor("grey")) form.widget.setChart(chart) with open('best_history.csv', 'w', newline='', encoding='utf8') as history_csvfile: history_writer = csv.writer( history_csvfile, delimiter=';', dialect=csv.excel) history_writer.writerow(['Parametry']) history_writer.writerow(['Precyzja: 10^-%d' % precision]) history_writer.writerow(['Iteracje: %d' % generations_number]) history_writer.writerow(['', 'real', 'bin', 'f(real)']) for index, generation in enumerate(range(generations_number)): history_writer.writerow([index, best_reals[generation], best_binary[generation], best_fxs[generation]]) app.restoreOverrideCursor()