def __init__(self, parent=None): super(TestChart, self).__init__(parent) self.xRange = 800 self.sampleRate = 5 self.counter = 0 self.seriesList = [] self.legend().show() self.axisX = QValueAxis() self.axisX.setRange(0, self.xRange) self.addAxis(self.axisX, Qt.AlignBottom) # self.setAxisX(self.axisX, series) self.axisY = QValueAxis() self.axisY.setRange(-1, 1) self.addAxis(self.axisY, Qt.AlignLeft) # self.setAxisY(self.axisY, series) for i in range(24): series = QLineSeries() series.setName("Series" + str(i)) series.setUseOpenGL(True) self.addSeries(series) self.seriesList.append(series) series.attachAxis(self.axisX) series.attachAxis(self.axisY)
def add_new_data(self, data: dict): self.x += self.time.msec() self.time.start() if self.x > 10000: self.ax.setRange(self.x - 10000, self.x) for key in data: try: value = float(data[key]) except ValueError: continue if value > self.ymax: self.ymax = value self.ay.setRange(self.ymin, self.ymax) elif value < self.ymin: self.ymin = value self.ay.setRange(self.ymin, self.ymax) if key in self.lines: if self.lines[key].__len__() >= 32: # self.lines[key].replace(0,self.x, value) self.lines[key].remove(0) # else: self.lines[key].append(self.x, value) else: # ls = QSplineSeries(self) ls = QLineSeries(self) ls.append(self.x, value) ls.setColor( QColor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) ls.setName(key) self.chart().addSeries(ls) self.chart().setAxisX(self.ax, ls) self.chart().setAxisY(self.ay, ls) self.lines[key] = ls
def __init__(self, number: int, parent=None): super(QWidget, self).__init__(parent) self.layout = QVBoxLayout(self) self.chart = QChart() self.chartView = QChartView(self.chart) self.chartView.setRenderHint(QPainter.Antialiasing) # 抗锯齿 self.layout.addWidget(self.chartView) self.channelNumber = number for index in range(self.channelNumber): tmp = QLineSeries() tmp.setName("channel "+str(index)) self.chart.addSeries(tmp) self.chart.createDefaultAxes() self.chart.axisX().setRange(0, 25) self.chart.axisX().setTitleText("AAA") self.chart.axisY().setRange(0, 25) self.chart.axisY().setTitleText("BBB") # 标题 self.chart.setTitle("XXX XXX XXX") # 指示颜色所代表的内容 # self.chart.legend().hide() # 动画效果 self.chart.setAnimationOptions(QChart.AllAnimations)
def start_record(self): self.chart.removeAllSeries() self.series = [] try: for port in self.ports: udp = UdpServer(port) udp.start() self.udpthreads.append(udp) series = QLineSeries() series.setName(str(port)) self.chart.addSeries(series) finally: pass if not self.chkMode.isChecked(): series = QLineSeries() series.setName("Total") self.chart.addSeries(series) self.chart.createDefaultAxes() axis_x = self.chart.axisX() axis_x.setRange(0, self.axis_x_val) axis_x.setLabelFormat("%g") axis_x.setTitleText("Time / " + self.axis_x_unit_str[self.axis_x_unit]) axis_y = self.chart.axisY() axis_y.setRange(0, self.axis_y_val) axis_y.setLabelFormat("%g") axis_y.setTitleText("Bitrate / " + self.axis_y_unit_str[self.axis_y_unit]) self.timer.start(self.axis_x_step * 1000)
def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Demo12_1, QChart 基本绘图") self.resize(580, 420) chart = QChart() chart.setTitle("简单函数曲线") chartView = QChartView(self) chartView.setChart(chart) self.setCentralWidget(chartView) series0 = QLineSeries() series1 = QLineSeries() series0.setName("sin曲线") series1.setName("cos曲线") chart.addSeries(series0) chart.addSeries(series1) t = 0 intv = 0.1 pointCount = 100 for i in range(pointCount): y1 = math.cos(t) series0.append(t, y1) y2 = 1.5 * math.sin(t + 20) series1.append(t, y2) t = t + intv axisX = QValueAxis() axisX.setRange(0, 10) axisX.setTitleText("time(secs)") axisY = QValueAxis() axisY.setRange(-2, 2) axisY.setTitleText("value") chart.setAxisX(axisX, series0) chart.setAxisY(axisY, series0) chart.setAxisX(axisX, series1) chart.setAxisY(axisY, series1)
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 __init__(self, spec): super().__init__(None) self.spec = spec self.chart = QChart() # self.chart.setTitle(str(self.spec.variables)) # self.chart.legend().hide() for i in range(len(self.spec.variables)): series = QLineSeries() series.setColor( QColor( self.spec.colors[i][0], self.spec.colors[i][1], self.spec.colors[i][2], )) series.setName(self.spec.variables[i]) self.chart.addSeries(series) self.setMinimumWidth(400) self.setMinimumHeight(230) self.setChart(self.chart) self.setRenderHint(QPainter.Antialiasing) self.chart.createDefaultAxes() self.autoscale_y_axis = True if self.spec.min_y and self.spec.max_y: self.autoscale_y_axis = False self.chart.axes()[1].setRange(self.spec.min_y, self.spec.max_y) self._updates_per_second = 60 self._data = [] self._min = 0 self._max = 0
def initChart(self, NumSection, Alltime, PlotData, name): self._chart = QChart(title=name) self._chart.setAcceptHoverEvents(True) # Series动画 self._chart.setAnimationOptions(QChart.SeriesAnimations) # dataTable = [ # ["邮件营销", [120, 132, 101, 134, 90, 230]], # ["联盟广告", [220, 182, 191, 234, 290, 330, 310]], # ["视频广告", [150, 232, 201, 154, 190, 330, 410]], # ["直接访问", [320, 332, 301, 334, 390, 330, 320]], # ["搜索引擎", [820, 932, 901, 934, 1290, 1330, 1320]] # ] for series_name, data_list, label_list in PlotData: series = QLineSeries(self._chart) for j, v in zip(label_list, data_list): series.append(j, v) series.setName(series_name) series.setPointsVisible(True) # 显示圆点 series.hovered.connect(self.handleSeriesHoverd) # 鼠标悬停 self._chart.addSeries(series) self._chart.createDefaultAxes() # 创建默认的轴 axisX = self._chart.axisX() # x轴 axisX.setTickCount(Alltime) # x轴设置7个刻度 axisX.setGridLineVisible(False) # 隐藏从x轴往上的线条 axisY = self._chart.axisY() axisY.setTickCount(NumSection) # y轴设置7个刻度 axisY.setRange(0, NumSection) # 设置y轴范围 # 自定义x轴 axis_x = QCategoryAxis( self._chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue) axis_x.setTickCount(Alltime + 1) axis_x.setGridLineVisible(False) min_x = axisX.min() for i in range(0, Alltime + 1): axis_x.append(str(i), min_x + i) self._chart.setAxisX(axis_x, self._chart.series()[-1]) # 自定义y轴 axis_y = QCategoryAxis( self._chart, labelsPosition=QCategoryAxis.AxisLabelsPositionCenter) axis_y.setTickCount(NumSection) axis_y.setRange(0, NumSection) for i in range(0, NumSection + 1): axis_y.append('section%i' % (NumSection - i + 1), i) self._chart.setAxisY(axis_y, self._chart.series()[-1]) # chart的图例 legend = self._chart.legend() # 设置图例由Series来决定样式 legend.setMarkerShape(QLegend.MarkerShapeFromSeries) # 遍历图例上的标记并绑定信号 for marker in legend.markers(): # 点击事件 marker.clicked.connect(self.handleMarkerClicked) # 鼠标悬停事件 marker.hovered.connect(self.handleMarkerHovered) self.setChart(self._chart)
def __init__(self, parent=None): super(TableWidget, self).__init__(parent) # Create a simple model for storing data. model = CustomTableModel() # Create the table view and add the model to it. tableView = QTableView() tableView.setModel(model) tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) tableView.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) chart = QChart() chart.setAnimationOptions(QChart.AllAnimations) # Series 1. series = QLineSeries() series.setName("Line 1") mapper = QVXYModelMapper(self) mapper.setXColumn(0) mapper.setYColumn(1) mapper.setSeries(series) mapper.setModel(model) chart.addSeries(series) # Get the color of the series and use it for showing the mapped area. seriesColorHex = self._series_color(series) model.addMapping(seriesColorHex, QRect(0, 0, 2, model.rowCount())) # Series 2. series = QLineSeries() series.setName("Line 2") mapper = QVXYModelMapper(self) mapper.setXColumn(2) mapper.setYColumn(3) mapper.setSeries(series) mapper.setModel(model) chart.addSeries(series) # Get the color of the series and use it for showing the mapped area. seriesColorHex = self._series_color(series) model.addMapping(seriesColorHex, QRect(2, 0, 2, model.rowCount())) chart.createDefaultAxes() chartView = QChartView(chart) chartView.setRenderHint(QPainter.Antialiasing) chartView.setMinimumSize(640, 480) # Create the main layout. mainLayout = QGridLayout() mainLayout.addWidget(tableView, 1, 0) mainLayout.addWidget(chartView, 1, 1) mainLayout.setColumnStretch(1, 1) mainLayout.setColumnStretch(0, 0) self.setLayout(mainLayout)
def __init__(self, window): super().__init__() self.windowWidget = window self.repaintChartEvent.connect(self.repaint_chart) self.lambda_value = 0.2 self.beta_value = 3 self.mu_value = 0.8 grid = QGridLayout() self.setLayout(grid) self.table = MyQtTable.MyQtTable(1, 1) self.table.setFixedWidth(150) grid.addWidget(self.table, 1, 0, -1, 1) series = QLineSeries() series.setName("Values time series") self.chart_view = MyQtChart.MyChartView(series, "Chart", "Time", "Value", minimumSize=QSize(800, 650)) grid.addWidget(self.chart_view, 2, 1, 1, -1) self.table.newTableDataEvent.connect(self.update_chart) lambdaValueLabel = QLabel("λ=%.2f" % self.lambda_value) grid.addWidget(lambdaValueLabel, 1, 1) self.lambdaValueLabel = lambdaValueLabel qslider = QSlider(Qt.Horizontal) qslider.setMinimum(0) qslider.setMaximum(100) qslider.setValue(self.lambda_value * 100) qslider.valueChanged.connect(self.on_lambda_changed) qslider.sliderMoved.connect( lambda v: lambdaValueLabel.setText("λ=%.2f" % (v / 100))) qslider.setTracking(False) grid.addWidget(qslider, 1, 2) grid.addWidget(QLabel("μ="), 1, 3) muEdit = QDoubleSpinBox() muEdit.setValue(self.mu_value) muEdit.setSingleStep(0.1) grid.addWidget(muEdit, 1, 4) muEdit.valueChanged.connect(self.on_mu_changed) grid.addWidget(QLabel("β="), 1, 5) betaEdit = QDoubleSpinBox() betaEdit.setValue(self.beta_value) betaEdit.setSingleStep(0.1) grid.addWidget(betaEdit, 1, 6) betaEdit.valueChanged.connect(self.on_beta_changed)
def initChart(self): self._chart = QChart(title="农业大棚数据监测曲线") self._chart.setAcceptHoverEvents(True) # Series动画 self._chart.setAnimationOptions(QChart.SeriesAnimations) dataTable = [["大棚湿度", []], ["大棚温度", []], ["大棚二氧化碳浓度", []]] data = pd.read_csv("data/data.csv") list = data.values.tolist() for i in range(30): dataTable[0][1].append(list[i * 60][3]) dataTable[1][1].append(list[i * 60][4]) dataTable[2][1].append(list[i * 60][5]) # dataTable = [ # ["邮件营销", [120, 132, 101, 134, 90, 230, 210]], # ["直接访问", [320, 332, 301, 334, 390, 330, 320]], # ["搜索引擎", [820, 932, 901, 934, 1290, 1330, 1320]] # ] for series_name, data_list in dataTable: series = QLineSeries(self._chart) for j, v in enumerate(data_list): series.append(j, v) series.setName(series_name) series.setPointsVisible(True) # 显示圆点 series.hovered.connect(self.handleSeriesHoverd) # 鼠标悬停 self._chart.addSeries(series) self._chart.createDefaultAxes() # 创建默认的轴 axisX = self._chart.axisX() # x轴 axisX.setTickCount(30) # x轴设置30个刻度 axisX.setGridLineVisible(False) # 隐藏从x轴往上的线条 axisY = self._chart.axisY() axisY.setTickCount(10) # y轴设置10个刻度 axisY.setRange(0, 100) # 设置y轴范围 # 自定义x轴 axis_x = QCategoryAxis( self._chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue) axis_x.setTickCount(30) axis_x.setGridLineVisible(False) min_x = axisX.min() max_x = axisX.max() step = (max_x - min_x) / (30 - 1) # 7个tick for i in range(0, 30): axis_x.append(self.category[i], min_x + i * step) self._chart.setAxisX(axis_x, self._chart.series()[-1]) # chart的图例 legend = self._chart.legend() # 设置图例由Series来决定样式 legend.setMarkerShape(QLegend.MarkerShapeFromSeries) # 遍历图例上的标记并绑定信号 for marker in legend.markers(): # 点击事件 marker.clicked.connect(self.handleMarkerClicked) # 鼠标悬停事件 marker.hovered.connect(self.handleMarkerHovered) self.setChart(self._chart)
def add_series(self, x_list, y_list, name): series = QLineSeries() series.setName(name) for x, y in zip(x_list, y_list): series.append(x, y) self.model.addSeries(series) self.model.createDefaultAxes()
def __createChart(self): self.__chart = QChart() self.__chart.setTitle("简单函数曲线") self.ui.chartView.setChart(self.__chart) self.ui.chartView.setRenderHint(QPainter.Antialiasing) series0 = QLineSeries() series0.setName("Sin曲线") series1 = QLineSeries() series1.setName("Cos曲线") self.__curSeries=series0 #当前序列 pen=QPen(Qt.red) pen.setStyle(Qt.DotLine) #SolidLine, DashLine, DotLine, DashDotLine pen.setWidth(2) series0.setPen(pen) #序列的线条设置 pen.setStyle(Qt.SolidLine) #SolidLine, DashLine, DotLine, DashDotLine pen.setColor(Qt.blue) series1.setPen(pen) #序列的线条设置 self.__chart.addSeries(series0) self.__chart.addSeries(series1) axisX = QValueAxis() self.__curAxis=axisX #当前坐标轴 axisX.setRange(0, 10) #设置坐标轴范围 axisX.setLabelFormat("%.1f") #标签格式 axisX.setTickCount(11) #主分隔个数 axisX.setMinorTickCount(4) axisX.setTitleText("time(secs)") #标题 axisX.setGridLineVisible(True) axisX.setMinorGridLineVisible(False) axisY = QValueAxis() axisY.setRange(-2, 2) axisY.setLabelFormat("%.2f") #标签格式 axisY.setTickCount(5) axisY.setMinorTickCount(4) axisY.setTitleText("value") axisY.setGridLineVisible(True) axisY.setMinorGridLineVisible(False) ## self.__chart.setAxisX(axisX, series0) #添加X坐标轴 ## self.__chart.setAxisX(axisX, series1) #添加X坐标轴 ## self.__chart.setAxisY(axisY, series0) #添加Y坐标轴 ## self.__chart.setAxisY(axisY, series1) #添加Y坐标轴 ##另一种实现设置坐标轴的方法 self.__chart.addAxis(axisX,Qt.AlignBottom) #坐标轴添加到图表,并指定方向 self.__chart.addAxis(axisY,Qt.AlignLeft) series0.attachAxis(axisX) #序列 series0 附加坐标轴 series0.attachAxis(axisY) series1.attachAxis(axisX) #序列 series1 附加坐标轴 series1.attachAxis(axisY)
def getChart(title): chart = QChart(title=title) for i, data_list in enumerate(m_dataTable): series = QLineSeries(chart) for value, _ in data_list: series.append(*value) series.setName("Series " + str(i)) chart.addSeries(series) chart.createDefaultAxes() # 创建默认的轴 return chart
def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Demo12_1, QChart基本绘图") self.resize(580, 420) #创建chart和chartView chart = QChart() #创建 Chart chart.setTitle("简单函数曲线") chartView = QChartView(self) #创建 ChartView chartView.setChart(chart) #Chart添加到ChartView self.setCentralWidget(chartView) #创建曲线序列 series0 = QLineSeries() series1 = QLineSeries() series0.setName("Sin曲线") series1.setName("Cos曲线") chart.addSeries(series0) #序列添加到图表 chart.addSeries(series1) #序列添加数值 t = 0 intv = 0.1 pointCount = 100 for i in range(pointCount): y1 = math.cos(t) series0.append(t, y1) y2 = 1.5 * math.sin(t + 20) series1.append(t, y2) t = t + intv ##创建坐标轴 axisX = QValueAxis() #X 轴 axisX.setRange(0, 10) #设置坐标轴范围 axisX.setTitleText("time(secs)") #标题 ## axisX.setLabelFormat("%.1f") #标签格式 ## axisX.setTickCount(11) #主分隔个数 ## axisX.setMinorTickCount(4) ## axisX.setGridLineVisible(false) axisY = QValueAxis() #Y 轴 axisY.setRange(-2, 2) axisY.setTitleText("value") ## axisY.setTickCount(5) ## axisY.setMinorTickCount(4) ## axisY.setLabelFormat("%.2f") #标签格式 ## axisY.setGridLineVisible(false) #为序列设置坐标轴 chart.setAxisX(axisX, series0) #为序列设置坐标轴 chart.setAxisY(axisY, series0) chart.setAxisX(axisX, series1) #为序列设置坐标轴 chart.setAxisY(axisY, series1)
def on_run_pb_clicked(self): self.chart.removeAllSeries() min_function = 421.0 ga_answer = 0.0 correct = 0 incorrect = 0 ga = Ga(self.population_sb.value(), self.crossover_dsb.value(), self.mutation_dsb.value(), self.generation_sb.value(), self.elitism_cb.isChecked()) progress_dialog = QProgressDialog('Repetitions...', 'Cancel', 0, self.repetitions_sb.value(), self.window) progress_dialog.setWindowModality(Qt.WindowModal) ga_output = () for i in range(self.repetitions_sb.value()): ga_output = ga.run_generation() ga_answer = ga_output[0] if ga_answer == min_function: correct += 1 else: incorrect += 1 progress_dialog.setValue(i) if progress_dialog.wasCanceled(): break progress_dialog.setValue(self.repetitions_sb.value()) if self.single_run_rb.isChecked(): self.x_result_l.setText(str(ga_answer)) self.fx_l.setText('{0:.2f}'.format(ga.calc_function(ga_answer))) if ga_answer == min_function: self.icon_result_l.setPixmap('correct-icon.png') else: self.icon_result_l.setPixmap('incorrect-icon.png') # Graph series_1 = QLineSeries() series_1.setName('Average Fit') series_2 = QLineSeries() series_2.setName('Best Fit') for i in range(len(ga_output[1])): series_1.append(ga_output[1][i], ga_output[2][i]) series_2.append(ga_output[1][i], ga_output[3][i]) self.chart.addSeries(series_1) self.chart.addSeries(series_2) self.chart.createDefaultAxes() else: self.correct_results_l.setText(str(correct)) self.incorrect_results_l.setText(str(incorrect))
def createSeries(self, dataArray): series = QLineSeries() for i in range(len(dataArray)): value = QPointF(i, dataArray[i][0]) series.append(value) series.setColor(QColor(0, 255, 0)) self.removeSeries() series.setName("灰度图") self.qchart.addSeries(series) self.lastSeries = series
def __drawComparisonChart(self): self.__comparison_chart.removeAllSeries() series1 = QLineSeries(self) series2 = QLineSeries(self) series1.setName("Оптимальный") series2.setName("Другой") [(series1.append(i[0], i[1]), series2.append(i[0], i[2])) for i in self.__values] self.__comparison_chart.addSeries(series1) self.__comparison_chart.addSeries(series2) self.__comparison_chart.createDefaultAxes()
class ChartView(QChartView): def __init__(self): QChartView.__init__(self) #self.resize(300, 300) self.setRenderHint(QPainter.Antialiasing) # 抗锯齿 self.chart = QChart() self.seriesAcc = QLineSeries() self.seriesAcc.setName(CONF.leftUpNames[0]) self.chart.addSeries(self.seriesAcc) #声明并初始化X轴,Y轴 self.dtaxisX = QValueAxis() self.vlaxisY = QValueAxis() #设置坐标轴显示范围 self.dtaxisX.setMin(0) #self.dtaxisX.setMax(100) self.vlaxisY.setMin(0) #self.vlaxisY.setMax(100) self.dtaxisX.setTickCount(3) self.vlaxisY.setTickCount(3) #设置坐标轴名称 self.dtaxisX.setTitleText(CONF.leftUpNames[1]) self.vlaxisY.setTitleText(CONF.leftUpNames[2]) #设置网格不显示 self.vlaxisY.setGridLineVisible(False) #把坐标轴添加到chart中 self.chart.addAxis(self.dtaxisX, Qt.AlignBottom) self.chart.addAxis(self.vlaxisY, Qt.AlignLeft) self.seriesAcc.attachAxis(self.dtaxisX) self.seriesAcc.attachAxis(self.vlaxisY) self.initUI() def initUI(self): self.backend = BackendThread() self.backend.update_line.connect(self.handleLine) self.backend.start() def handleLine(self, data): if data[0] == 0: self.seriesAcc.clear() else: self.dtaxisX.setMax(data[0]) self.vlaxisY.setMax(data[0]) self.seriesAcc.clear() self.seriesAcc.append(0, 0) self.seriesAcc.append(data[0], data[1]) self.setChart(self.chart)
def add_data(self, xdata, ydata, color=None, legend_text=None): curve = QLineSeries() pen = curve.pen() if color is not None: pen.setColor(color) pen.setWidthF(1.5) curve.setPen(pen) # curve.setPointsVisible(True) # curve.setUseOpenGL(True) self.total_samples = max(self.total_samples, len(xdata)) # Decimate xdecimated, ydecimated = self.decimate(xdata, ydata) # Data must be in ms since epoch # curve.append(self.series_to_polyline(xdecimated * 1000.0, ydecimated)) # self.reftime = datetime.datetime.fromtimestamp(xdecimated[0]) # if len(xdecimated) > 0: # xdecimated = xdecimated - xdecimated[0] xdecimated *= 1000 # No decimal expected points = [] for i, _ in enumerate(xdecimated): # TODO hack # curve.append(QPointF(xdecimated[i], ydecimated[i])) points.append(QPointF(xdecimated[i], ydecimated[i])) curve.replace(points) points.clear() if legend_text is not None: curve.setName(legend_text) # Needed for mouse events on series self.chart.setAcceptHoverEvents(True) self.xvalues[self.ncurves] = np.array(xdecimated) # connect signals / slots # curve.clicked.connect(self.lineseries_clicked) # curve.hovered.connect(self.lineseries_hovered) # Add series self.chart.addSeries(curve) self.ncurves += 1 self.update_axes()
def initChart(self): self._chart = QChart(title="折线图堆叠") self._chart.setAcceptHoverEvents(True) # Series动画 self._chart.setAnimationOptions(QChart.SeriesAnimations) dataTable = [["邮件营销", [120, 132, 101, 134, 90, 230, 210]], ["联盟广告", [220, 182, 191, 234, 290, 330, 310]], ["视频广告", [150, 232, 201, 154, 190, 330, 410]], ["直接访问", [320, 332, 301, 334, 390, 330, 320]], ["搜索引擎", [820, 932, 901, 934, 1290, 1330, 1320]]] for series_name, data_list in dataTable: series = QLineSeries(self._chart) for j, v in enumerate(data_list): series.append(j, v) series.setName(series_name) series.setPointsVisible(True) # 显示圆点 series.hovered.connect(self.handleSeriesHoverd) # 鼠标悬停 self._chart.addSeries(series) self._chart.createDefaultAxes() # 创建默认的轴 axisX = self._chart.axisX() # x轴 axisX.setTickCount(7) # x轴设置7个刻度 axisX.setGridLineVisible(False) # 隐藏从x轴往上的线条 axisY = self._chart.axisY() axisY.setTickCount(7) # y轴设置7个刻度 axisY.setRange(0, 1500) # 设置y轴范围 # 自定义x轴 axis_x = QCategoryAxis( self._chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue) axis_x.setTickCount(7) axis_x.setGridLineVisible(False) min_x = axisX.min() max_x = axisX.max() step = (max_x - min_x) / (7 - 1) # 7个tick for i in range(0, 7): axis_x.append(self.category[i], min_x + i * step) self._chart.setAxisX(axis_x, self._chart.series()[-1]) # self._chart.addAxis(axis_x, Qt.AlignBottom) # chart的图例 legend = self._chart.legend() # 设置图例由Series来决定样式 legend.setMarkerShape(QLegend.MarkerShapeFromSeries) # 遍历图例上的标记并绑定信号 for marker in legend.markers(): # 点击事件 marker.clicked.connect(self.handleMarkerClicked) # 鼠标悬停事件 marker.hovered.connect(self.handleMarkerHovered) self.setChart(self._chart)
def createLineChart(self): chart = QChart() chart.setTitle("Line chart") for i, data_list in enumerate(self.m_dataTable): series = QLineSeries(chart) for value, _ in data_list: series.append(value) series.setName("Series " + str(i)) chart.addSeries(series) chart.createDefaultAxes() return chart
def add_data(self, data, chart, color=None): curve = QLineSeries(chart) curve.setName("latency") pen = curve.pen() if color is not None: pen.setColor(color) pen.setWidthF(1) curve.setPen(pen) curve.setUseOpenGL(True) for x in data: curve.append(x[0], x[1]) # curve.append(series_to_polyline(xdata, ydata)) chart.addSeries(curve) chart.createDefaultAxes() return curve
def XLineSeries(data_dict, key_order=None, xkey = None, openGL=False): if key_order == None: key_order = data_dict.keys() series = [] if xkey == None: xkey = list(key_order)[0] for key in key_order-xkey: set = QLineSeries(); set.setName(key) if openGL: set.setUseOpenGL(True) for i, (itemx, itemy) in enumerate(zip_longest(data_dict[xkey],data_dict[key])): set.append(itemx, itemy) series.append(set) return series
def rewrite_data(self, args): self.layout = QVBoxLayout() self.grid.addLayout(self.layout, 0, 0, 1, 1) for key, value in self.data[args].items(): chart = QChart() chart_view = QChartView(chart) series = QLineSeries() series.setName(key) for i in value: series.append(QPointF(i[0], i[1])) chart.addSeries(series) chart.createDefaultAxes() self.layout.addWidget(chart_view)
def create_series(self, dataTable, chart): # 创建折线的函数 for i, data_list in enumerate(dataTable): # [index,[list]] # 创建曲线 series = QLineSeries(chart._chart) # 设置折线名 series.setName(data_list[0]) for j, v in enumerate(data_list[1:]): # 添加折线和对应的坐标点 series.append(j, v) series.setPointsVisible(True) # 显示原点 # 鼠标悬停连接事件 series.hovered.connect(self.onSeriesHoverd) chart._chart.addSeries(series) # 添加折线到视图窗口 return chart._chart
def addSeries( self, _x2idx: typing.Dict, _idx2x: list, _chart: QChart, _axis_x: QValueAxis, _axis_y: QValueAxis ): series = QLineSeries() series.setName(self.name) for x, y in zip(self.x_list, self.y_list): series.append(_x2idx[x], y) if self.color is not None: series.setColor(self.color) _chart.addSeries(series) _chart.setAxisX(_axis_x, series) _chart.setAxisY(_axis_y, series) if self.show_value: self.createShow()
def __getSerie(self, serie=None): if not serie or not isinstance(serie, dict): return None types = serie.get("type", "") or "" data = serie.get("data", []) or [] if not data or not isinstance(data, list): return None if types == "line": _series = QLineSeries(self._chart) else: return None # 设置series名字 _series.setName(serie.get("name", "") or "") # 添加数据到series中 for index, value in enumerate(data): # 保证vlaue必须是数字 _series.append(index, value if type(value) in (int, float) else 0) return _series
def __drawBode(self): self.chart.removeAllSeries() #删除所有序列 ## 创建序列 pen = QPen(Qt.red) pen.setWidth(2) seriesMag = QLineSeries() #幅频曲线序列 seriesMag.setName("幅频曲线") seriesMag.setPen(pen) seriesMag.setPointsVisible(False) seriesMag.hovered.connect(self.do_seriesMag_hovered) seriesPhase = QLineSeries() #相频曲线序列 pen.setColor(Qt.blue) seriesPhase.setName("相频曲线") seriesPhase.setPen(pen) seriesPhase.setPointsVisible(True) seriesPhase.hovered.connect(self.do_seriesPhase_hovered) ## 为序列添加数据点 count = len(self.__vectW) #数据点数 for i in range(count): seriesMag.append(self.__vectW[i], self.__vectMag[i]) seriesPhase.append(self.__vectW[i], self.__VectPhase[i]) ##设置坐标轴范围 minMag = min(self.__vectMag) maxMag = max(self.__vectMag) minPh = min(self.__VectPhase) maxPh = max(self.__VectPhase) self.__axisMag.setRange(minMag, maxMag) self.__axisPhase.setRange(minPh, maxPh) ##序列添加到chart,并指定坐标轴 self.chart.addSeries(seriesMag) seriesMag.attachAxis(self.__axisFreq) seriesMag.attachAxis(self.__axisMag) self.chart.addSeries(seriesPhase) seriesPhase.attachAxis(self.__axisFreq) seriesPhase.attachAxis(self.__axisPhase) for marker in self.chart.legend().markers(): #QLegendMarker类型列表 marker.clicked.connect(self.do_LegendMarkerClicked)
class PeersCountGraphView(BaseTimedGraph): peersCountFetched = AsyncSignal(int) def __init__(self, parent=None): super(PeersCountGraphView, self).__init__(parent=parent) self.setObjectName('PeersCountGraph') self.peersCountFetched.connectTo(self.onPeersCount) self.axisY.setTitleText(iPeers()) pen = QPen(QColor('#60cccf')) pen.setWidth(2) self.seriesPeers = QLineSeries() self.seriesPeers.setName('Peers') self.seriesPeers.setPen(pen) self.chart.addSeries(self.seriesPeers) self.seriesPeers.attachAxis(self.axisX) self.seriesPeers.attachAxis(self.axisY) self.setChart(self.chart) async def onPeersCount(self, count): dtNow = QDateTime.currentDateTime() dtMsecs = dtNow.toMSecsSinceEpoch() delta = 120 * 1000 if not self.seriesPurgedT or (dtMsecs - self.seriesPurgedT) > delta: self.removeOldSeries(self.seriesPeers, dtMsecs - delta) self.seriesPurgedT = dtMsecs peersVector = self.seriesPeers.pointsVector() values = [p.y() for p in peersVector] if values: self.axisY.setMax(max(values) + 10) self.axisY.setMin(min(values) - 10) dateMin = QDateTime.fromMSecsSinceEpoch(dtMsecs - (30 * 1000)) dateMax = QDateTime.fromMSecsSinceEpoch(dtMsecs + 2000) self.seriesPeers.append(dtMsecs, count) self.axisX.setRange(dateMin, dateMax)