def set_x_aix(self, years: []) -> QValueAxis: # x轴坐标——年份 x_aix = QValueAxis() x_aix.setRange(years[0], years[-1]) x_aix.setLabelFormat('%d') x_aix.setGridLineVisible(True) x_aix.setTickCount(len(years)) x_aix.setMinorTickCount(5) # 每两个月一个小分级 return x_aix
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 plot_candlechart(ohlc_data): app = ParaMakerApplication([]) #app.setStyleSheet("background-color:black;") series = QCandlestickSeries() series.setBodyOutlineVisible(False) series.setDecreasingColor(Qt.red) series.setIncreasingColor(Qt.green) rsi = qc.QLineSeries() # 5-days average data line rsi.append(QPointF(ohlc_data[300].timestamp, ohlc_data[300].closed)) rsi.append(QPointF(ohlc_data[700].timestamp, ohlc_data[700].closed)) #rsi.append(QPointF(ohlc_data[150].timestamp, ohlc_data[100].closed)) tm = [] # stores str type data # in a loop, series and rsi append corresponding data for candle in ohlc_data: series.append( QCandlestickSet(candle.opened, candle.high, candle.low, candle.closed)) #rsi.append(QPointF(num, m)) tm.append(str(candle.timestamp)) #rsi.append(str(candle.timestamp)) #rsi_values = calculate_rsi(14, ohlc_data) chart = QChart() chart.setBackgroundVisible(False) chart.setPlotAreaBackgroundVisible(False) chart.addSeries(series) # candle chart.addSeries(rsi) # rsi line #chart.axisX(rsi).setRange(ohlc_data[0].timestamp, ohlc_data[-1].timestamp) chart.createDefaultAxes() axisXRSI = QValueAxis() axisYRSI = QValueAxis() axisXRSI.setRange(ohlc_data[0].timestamp, ohlc_data[-1].timestamp) axisYRSI.setRange(ohlc_data[0].closed, ohlc_data[-1].closed) axisXRSI.setGridLineVisible(False) axisYRSI.setGridLineVisible(False) chart.setAxisX(axisXRSI, rsi) chart.setAxisY(axisYRSI, rsi) chart.legend().hide() chart.axisX(series).setCategories(tm) #chart.axisX(series).setGridLineVisible(False) #chart.axisY(series).setGridLineVisible(False) ###chart.axisX(rsi).setVisible(False) chartview = QChartView(chart) chartview.setRenderHint(QPainter.Antialiasing) ui = ParaMakerWindow() ui.setCentralWidget(chartview) sys.exit(app.exec_())
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()
def __createChart(self): self.__chart = QChart() self.ui.chartView.setChart(self.__chart) self.__chart.legend().setVisible(False) #隐藏图例 self.__chart.setMargins(QMargins(0, 0, 0, 0)) #把间距设置到最小 #初始化线条数组 series = [QLineSeries() for _ in range(15)] color = [ '#FF88C2', '#FF8888', '#FFA488', '#FFBB66', '#FFDD55', '#FFFF77', '#DDFF77', '#BBFF66', '#66FF66', '#77FFCC', '#77FFEE', '#66FFFF', '#77DDFF', '#99BBFF', '#9999FF' ] #设置线条颜色形状 pen = QPen() pen.setStyle(Qt.SolidLine) pen.setWidth(2) for i in range(15): pen.setColor(QColor(color[i])) series[i].setPen(pen) #向表格添加线条 for i in range(15): self.__chart.addSeries(series[i]) #设置坐标轴 axisX = QValueAxis() #self.__curAxis=axisX #当前坐标轴 axisX.setRange(0, 200) #设置坐标轴范围 axisX.setLabelFormat("%d") #标签格式 axisX.setTickCount(5) #主分隔个数 axisX.setMinorTickCount(4) axisX.setGridLineVisible(True) axisX.setMinorGridLineVisible(False) axisY = QValueAxis() axisY.setRange(0, 1024) axisY.setLabelFormat("%d") #标签格式 axisY.setTickCount(5) axisY.setMinorTickCount(4) axisY.setGridLineVisible(True) axisY.setMinorGridLineVisible(False) self.__chart.addAxis(axisX, Qt.AlignBottom) #坐标轴添加到图表,并指定方向 self.__chart.addAxis(axisY, Qt.AlignLeft) for i in range(15): series[i].attachAxis(axisX) series[i].attachAxis(axisY)
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)
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 set_y_aix(self, areas: []) -> QValueAxis: # y轴坐标——面积 ma = [] for i in range(0, len(areas)): m = max(areas[i]) ma.append(m) bound = max(ma) y_aix = QValueAxis() y_aix.setRange(0, int(bound)) y_aix.setLabelFormat('%d') y_aix.setGridLineVisible(True) y_aix.setTickCount(11) y_aix.setMinorTickCount(4) return y_aix
class XChartProbit(QChart): def __init__(self, parent=None): super(QChart, self).__init__(parent) # Class Vars self.activeDistr = 'lognorm' self.knowndistr = distr._distrnames() self.data = dict() # Axis Setup self.axisX = QValueAxis() self.axisY = QValueAxis() self.axisX.setLabelsVisible(False) self.axisX.setTickCount(2) self.axisX.setTitleText("Series Fractional Probability") self.axisY.setTitleText("Value") self.setAxesMinMax(-3, 3, 0.01, 1.5) self.axisX.setMinorGridLineVisible(False) self.axisX.setGridLineVisible(False) # define the default grid colour to grey self.setGridColor(110, 110, 110) self.setActiveProbit(self.activeDistr) self.plotAreaChanged.connect(self.onPlotSizeChanged) # method needed for axes change to redraw grid lines def addLinearReg(self, seriesname): x = self.data[seriesname]['X'], y = self.data[seriesname][seriesname] # adds a linear regression line for a data set x,y slope, intercept, r_value, p_value, std_err = linregress(x, y) xmin = distr.distrppf(self.activeDistr, 0.01) xmax = distr.distrppf(self.activeDistr, 0.99) ymin = slope * xmin + intercept ymax = slope * xmax + intercept data = dict() data['X'] = [xmin, xmax] data['LinearReg'] = [ymin, ymax] lines = XLineSeries(data, xkey='X', openGL=True) self.addSeries(lines[0]) self.setAxes(lines[0]) def loadSeries(self, arr, name): # takes a list/array arr y = array(arr).copy() y.sort() self.data[name] = y self.redrawChart() def plotSeries(self, name): nsamp = len(self.data[name]) # add data to temport dictionary tdict = dict() if self.activeScale == 'log10': tdict[name] = log10(self.data[name]) elif self.activeScale == 'linear': tdict[name] = self.data[name] tdict['X'] = distr.distrppf(self.activeProbit, [ percentileofscore(self.data[name], self.data[name][i]) / 100.00001 for i in range(0, nsamp) ]) series = XScatterSeries(tdict, xkey='X', openGL=True) self.addSeries(series[0]) self.setAxes(series[0]) def _replotData(self): for key in self.data.keys(): self.pl def axesMinMax(self): # returns a length 4 list of the axes min and max values [x1,x2,y1,y2] return [ self.axisX.min(), self.axisX.max(), self.axisY.min(), self.axisY.max() ] def redrawChart(self): self.removeAllSeries() self._removeHorizontalGridLabels() self.resetAxes() self._drawVerticalGridLines() if self.activeScale == 'log10': self.axisY.setLabelsVisible(False) self.axisY.setTickCount(1) self.setTitle("Log Probit Plot") self.axisY.setMinorGridLineVisible(False) self.axisY.setGridLineVisible(False) self._drawHorizontalGridLine() self._drawHorizontalLabels() self._drawHorizontalGridlLabels() elif self.activeScale == 'linear': self.axisY.setLabelsVisible(True) self.axisY.setTickCount(10) self.setTitle("Probit Plot") self.axisY.setMinorGridLineVisible(True) self.axisY.setGridLineVisible(True) for serkey in self.data.keys(): self.plotSeries(serkey) def resetAxes(self): ymins = [] ymaxs = [] for key in self.data.keys(): ymins.append(min(self.data[key])) ymaxs.append(max(self.data[key])) try: ymin = min(ymins) ymax = max(ymaxs) except ValueError: ymin = 1.1 ymax = 2 xmin = distr.distrppf(self.activeProbit, 0.001) xmax = distr.distrppf(self.activeProbit, 0.999) if self.activeScale == 'linear': yscal = 0.1 * (ymax - ymin) self.setAxesMinMax(xmin, xmax, ymin - yscal, ymax + yscal) elif self.activeScale == 'log10': yscal = 0.1 * (log10(ymax) - log10(ymin)) self.setAxesMinMax(xmin, xmax, log10(ymin), log10(ymax)) #self.setAxesMinMax(xmin,xmax,log10(ymin)-yscal,log10(ymax)+yscal*0.1) def setGridColor(self, r, g, b): # sets the colour of the background grid self.gridcolor = QColor(r, g, b) def setActiveProbit(self, type): if type in self.knowndistr: self.activeDistr = type if type == 'norm': self.activeProbit = 'norm' self.activeScale = 'linear' elif type == 'lognorm': self.activeProbit = 'norm' self.activeScale = 'log10' #self.redrawChart() def setActiveScale(self, newscale): self.activeScale = newscale def setAxes(self, series): # assigns a series to the chart default axes self.setAxisX(self.axisX, series) self.setAxisY(self.axisY, series) def setAxesMinMax(self, x1, x2, y1, y2): # sets the min max values in X and Y self.axisX.setMin(x1) self.axisX.setMax(x2) self.axisY.setMin(y1) self.axisY.setMax(y2) def _drawHorizontalLabels(self): xmin = self.axisX.min() xmax = self.axisX.max() axisScale = 1 / (xmax - xmin ) # scaler for plotted axis (reduces to 0-1.0) # calculate probit values to scale from grid lines insert min and max values to scale correctly vlabx = distr.distrppf(self.activeProbit, self.vgridx) vlabx = insert(vlabx, 0, xmin) vlabx = insert(vlabx, len(vlabx), xmax) vlabx = ( vlabx - xmin ) * axisScale #scale the probit value to ratios of the Xaxis length paw = self.plotArea().width() pah = self.plotArea().height() #find the plot width and height # find plot bottom left corner X and Y pblx = self.plotArea().bottomLeft().x() pbly = self.plotArea().bottomLeft().y() # offset from axix by 10 pixels -> may need to automate this offset in future pbly_lab = pbly + 10 # calculate the position on the chart in x plane with which to place each label. pblx = [pblx + int(paw * x) for x in vlabx[1:-1]] try: self.hlabels except AttributeError: self.hlabels = [] for i, labx in enumerate( pblx): #run through labels and create and position them # label text based on P scale ltext = 'P' + '%02d' % round(100.0 * (1.0 - self.vgridx[i])) self.hlabels.append(self.scene().addText(ltext)) for i, labx in enumerate( pblx): #run through labels and create and position them self.hlabels[i].setPos( labx - 0.5 * self.hlabels[i].boundingRect().width(), pbly) #centre on tick marks def _drawVerticalGridLines(self): self.vgridx = arange(0.05, 1.0, 0.05) self.vgridx = insert(self.vgridx, 0, [0.01, 0.02]) self.vgridx = insert(self.vgridx, len(self.vgridx), [0.98, 0.99]) vgridy = [self.axisY.min(), self.axisY.max()] self.vgridseries = [] for val in self.vgridx: line = 'P' + '%02d' % round(100.0 * (1.0 - val)) tdict = { 'X': [distr.distrppf(self.activeProbit, val)] * 2, line: vgridy } self.vgridseries = self.vgridseries + XLineSeries( tdict, xkey='X', openGL=True) for i, line in enumerate(self.vgridseries): pen = line.pen() pen.setColor(self.gridcolor) pen.setWidthF(0.4), line.setPen(pen) line.setPointLabelsVisible(True) self.addSeries(line) self.setAxes(line) self.legend().markers(line)[0].setVisible(False) def _drawHorizontalGridLine(self): # calculate xmin and xmax points for lines to completely cross graph hgridx = [ distr.distrppf(self.activeProbit, 0.0001) - 1, distr.distrppf(self.activeProbit, 0.9999) + 1 ] # calculate log scale for lines y values self.hgridy = self._logrange(10**self.axisY.min(), 10**self.axisY.max(), base=10) self.hgridseries = [] # create a line series for each lines and add to list for val in self.hgridy: line = '%d' % val tdict = {'X': hgridx, line: [log10(val)] * 2} self.hgridseries = self.hgridseries + XLineSeries( tdict, xkey='X', openGL=True) # add each of the series to the grid with special formatting for i, line in enumerate(self.hgridseries): pen = line.pen() pen.setColor(self.gridcolor) pen.setWidthF(0.4), line.setPen(pen) self.addSeries(line) self.setAxes(line) self.legend().markers(line)[0].setVisible(False) def _drawHorizontalGridlLabels(self): ymin = self.axisY.min() ymax = self.axisY.max() axisScale = 1 / (ymax - ymin ) # scaler for plotted axis (reduces to 0-1.0) # calculate base10 values to scale from grid lines insert min and max values to scale correctly vlaby = log10(self.hgridy) vlaby = insert(vlaby, 0, ymin) vlaby = insert(vlaby, len(vlaby), ymax) vlaby = ( vlaby - ymin ) * axisScale # scale the probit value to ratios of the Xaxis length paw = self.plotArea().width() pah = self.plotArea().height() # find the plot width and height # find plot bottom left corner X and Y pblx = self.plotArea().bottomLeft().x() pbly = self.plotArea().bottomLeft().y() # offset from axix by 10 pixels -> may need to automate this offset in future pblx_lab = pblx - 10 # calculate the position on the chart in y plane with which to place each label. pbly = [pbly - int(pah * y) for y in vlaby[1:-1]] self.vlabels = [] for i, labx in enumerate( pbly): # run through labels and create and position them # label text based on P scale ltext = str(self.hgridy[i]) self.vlabels.append(self.scene().addText(ltext)) for i, laby in enumerate( pbly): #run through labels and create and position them # label text based on P scale self.vlabels[i].setPos( pblx - self.vlabels[i].boundingRect().width() - 10, laby - 0.5 * self.vlabels[i].boundingRect().height()) #centre on tick marks def _removeHorizontalGridLine(self): for ser in self.hgridseries: self.removeSeries(ser) def _removeVerticalGridLine(self): for ser in self.vgridseries: self.removeSeries(ser) def _removeHorizontalGridLabels(self): try: for lab in self.vlabels: self.scene().removeItem(lab) except AttributeError: pass def _logrange(self, min, max, base=10): if min <= 0: min += max / (base**10) y = 1 bpow = base if min < base: while min < bpow: y -= 1 bpow = pow(base, y) else: while min > bpow: y += 1 bpow = pow(base, y) out = array([]) while bpow < max: y += 1 bpown = pow(base, y) out = append(out, arange(bpow, bpown, bpow)) bpow = bpown i = 0 j = 0 for ind, val in enumerate(out): if val <= min: i = ind if val <= max: j = ind return out[i:j + 1] @pyqtSlot() def onPlotSizeChanged(self): #reset position of labels self.redrawChart()
class QmyMainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) #调用父类构造函数,创建窗体 self.ui=Ui_MainWindow() #创建UI对象 self.ui.setupUi(self) #构造UI界面 self.setWindowTitle("Demo12_7, QAreaSeries绘制填充图") self.__buildStatusBar() self.ui.chartView.setRenderHint(QPainter.Antialiasing) self.ui.chartView.setCursor(Qt.CrossCursor) #设置鼠标指针为十字星 self.ui.chartView.mouseMove.connect(self.do_chartView_mouseMove) self.__colorLine=Qt.darkBlue #曲线颜色,darkBlue self.__colorFill=Qt.darkBlue #填充颜色 gray self.__iniChart() #创建self.chart ## "填充类型"4个RadioButton关联槽函数 self.ui.radioFill_Pos.clicked.connect(self.do_redrawFill) #positive self.ui.radioFill_Neg.clicked.connect(self.do_redrawFill) #negative self.ui.radioFill_Both.clicked.connect(self.do_redrawFill) #both self.ui.radioFill_None.clicked.connect(self.do_redrawWave) #wiggle ## ==============自定义功能函数======================== def __buildStatusBar(self): self.__labFileName = QLabel("数据文件") self.__labFileName.setMinimumWidth(200) self.ui.statusBar.addWidget(self.__labFileName) self.__labChartXY = QLabel("Chart, X=, Y=") self.__labChartXY.setMinimumWidth(200) self.ui.statusBar.addWidget(self.__labChartXY) self.__labAreaXY = QLabel("AreaSeries,X=, Y=") self.__labAreaXY.setMinimumWidth(200) self.ui.statusBar.addWidget(self.__labAreaXY) def __iniChart(self): self.chart = QChart() #创建 chart self.chart.setTitle("地震波形") self.chart.legend().setVisible(False) #不显示图例 self.ui.chartView.setChart(self.chart) #chart添加到chartView ## 创建坐标轴X self.__axisX = QValueAxis() # bottom 轴是 QValueAxis self.__axisX.setTitleText("时间(秒)") self.__axisX.setRange(0, 10) self.__axisX.setTickCount(10) self.__axisX.setLabelFormat("%.2f") #标签格式 self.chart.addAxis(self.__axisX,Qt.AlignBottom) ## 创建坐标轴Y self.__axisY = QValueAxis() # left 轴是 QValueAxis self.__axisY.setTitleText("幅度") self.__axisY.setRange(-5,5) self.__axisY.setTickCount(5) self.__axisY.setLabelFormat("%.2f") #标签格式 self.chart.addAxis(self.__axisY,Qt.AlignLeft) ## ==============event处理函数========================== ## ==========由connectSlotsByName()自动连接的槽函数============ ##=====工具栏 按钮功能 @pyqtSlot() ##“打开文件”按钮 def on_actOpen_triggered(self): curPath=QDir.currentPath() #获取当前路径 filename,flt=QFileDialog.getOpenFileName(self,"打开一个文件",curPath, "地震数据文件(*.txt);;所有文件(*.*)") if (filename==""): return aFile=open(filename,'r') allLines=aFile.readlines() #读取所有行,list类型,每行末尾带有 \n aFile.close() fileInfo=QFileInfo(filename) QDir.setCurrent(fileInfo.absolutePath()) self.__labFileName.setText("数据文件:"+fileInfo.fileName()) rowCnt=len(allLines) #行数,即数据点数 self.__vectData=[0]*rowCnt #列表 for i in range(rowCnt): lineText=allLines[i].strip() #字符串表示的数字 self.__vectData[i]=float(lineText) minV=min(self.__vectData) #最小值 self.ui.spinY_Min.setValue(minV) maxV=max(self.__vectData) #最大值 self.ui.spinY_Max.setValue(maxV) if self.ui.radioFill_None.isChecked(): self.do_redrawWave() #绘制波形曲线 else: self.do_redrawFill() #绘制有填充的波形 self.ui.frameSetup.setEnabled(True) @pyqtSlot() def on_actZoomIn_triggered(self): self.ui.chartView.chart().zoom(1.2) @pyqtSlot() def on_actZoomOut_triggered(self): self.ui.chartView.chart().zoom(0.8) @pyqtSlot() def on_actZoomReset_triggered(self): self.ui.chartView.chart().zoomReset() ## Y轴设置 @pyqtSlot() ##设置坐标范围 def on_btnY_SetRange_clicked(self): self.__axisY.setRange(self.ui.spinY_Min.value(), self.ui.spinY_Max.value()) @pyqtSlot(int) ##分度数 def on_spinY_Ticks_valueChanged(self,arg1): self.__axisY.setTickCount(arg1) @pyqtSlot(bool) ##显示网格线 def on_chkBoxY_GridLine_clicked(self,checked): self.__axisY.setGridLineVisible(checked) ## X轴设置 @pyqtSlot() ##设置坐标范围 def on_btnX_SetRange_clicked(self): self.__axisX.setRange(self.ui.spinX_Min.value(), self.ui.spinX_Max.value()) @pyqtSlot(int) ##分度数 def on_spinX_Ticks_valueChanged(self,arg1): self.__axisX.setTickCount(arg1) @pyqtSlot(bool) ##显示网格线 def on_chkBoxX_GridLine_clicked(self,checked): self.__axisX.setGridLineVisible(checked) ## =============自定义槽函数=============================== @pyqtSlot() ##绘制原始波形曲线 def do_redrawWave(self): self.chart.removeAllSeries() # 删除所有序列 pen=QPen(self.__colorLine) # 曲线颜色 pen.setWidth(2) seriesWave = QLineSeries() seriesWave.setUseOpenGL(True) seriesWave.setPen(pen) vx=0 intv=0.001 #1000Hz采样 pointCount=len(self.__vectData) for i in range(pointCount): value=self.__vectData[i] seriesWave.append(vx,value) vx =vx+ intv self.__axisX.setRange(0,vx) self.chart.addSeries(seriesWave) seriesWave.attachAxis(self.__axisX) seriesWave.attachAxis(self.__axisY) @pyqtSlot() ##绘制3种填充曲线 def do_redrawFill(self): self.chart.removeAllSeries() #删除所有序列 pen=QPen(self.__colorLine) #线条颜色 pen.setWidth(2) seriesFullWave = QLineSeries() #全波形 seriesFullWave.setUseOpenGL(True) seriesFullWave.setPen(pen) seriesPositive = QLineSeries() #正半部分曲线 seriesPositive.setUseOpenGL(True) seriesPositive.setVisible(False) #不显示 seriesNegative = QLineSeries() #负半部分曲线 seriesNegative.setUseOpenGL(True) seriesNegative.setVisible(False) #不显示即可 seriesZero = QLineSeries() #零均值线 seriesZero.setUseOpenGL(True) seriesZero.setVisible(False) #不显示即可 ## 填充数据 vx=0 intv=0.001 #1000Hz采样,数据点间隔时间 pointCount=len(self.__vectData) for i in range(pointCount): value=self.__vectData[i] seriesFullWave.append(vx,value) #完整波形 seriesZero.append(vx,0) #零值线 if value>0: seriesPositive.append(vx,value) #正半部分波形 seriesNegative.append(vx,0) else: seriesPositive.append(vx,0) seriesNegative.append(vx,value) #负半部分波形 vx =vx+intv self.__axisX.setRange(0,vx) ## 创建QAreaSeries序列,设置上、下界的QLineSeries对象 pen.setStyle(Qt.NoPen) #无线条,隐藏填充区域的边线 if self.ui.radioFill_Pos.isChecked(): #positive fill series = QAreaSeries(seriesPositive, seriesZero) #QAreaSeries series.setColor(self.__colorFill) #填充色 series.setPen(pen) #不显示线条 self.chart.addSeries(series) series.attachAxis(self.__axisX) series.attachAxis(self.__axisY) elif self.ui.radioFill_Neg.isChecked(): #negative fill series = QAreaSeries(seriesZero,seriesNegative) series.setColor(self.__colorFill) series.setPen(pen) #不显示线条 self.chart.addSeries(series) series.attachAxis(self.__axisX) series.attachAxis(self.__axisY) elif self.ui.radioFill_Both.isChecked(): #both fill series = QAreaSeries(seriesZero,seriesFullWave) series.setColor(self.__colorFill) series.setPen(pen) #不显示线条 self.chart.addSeries(series) series.attachAxis(self.__axisX) series.attachAxis(self.__axisY) series.clicked.connect(self.do_area_clicked) #关联槽函数 ## 构建QAreaSeries的两个QLineSeries序列必须添加到chart里,否则程序崩溃 self.chart.addSeries(seriesZero) #隐藏 self.chart.addSeries(seriesPositive) #隐藏 self.chart.addSeries(seriesNegative) #隐藏 self.chart.addSeries(seriesFullWave) #全波形曲线,显示 seriesPositive.attachAxis(self.__axisX) seriesPositive.attachAxis(self.__axisY) seriesNegative.attachAxis(self.__axisX) seriesNegative.attachAxis(self.__axisY) seriesZero.attachAxis(self.__axisX) seriesZero.attachAxis(self.__axisY) seriesFullWave.attachAxis(self.__axisX) seriesFullWave.attachAxis(self.__axisY) def do_chartView_mouseMove(self,point): pt=self.ui.chartView.chart().mapToValue(point) #QPointF 转换为图表的数值 self.__labChartXY.setText("Chart X=%.2f,Y=%.2f"%(pt.x(),pt.y())) #状态栏显示 def do_area_clicked(self,point): self.__labAreaXY.setText("AreaSeries X=%.2f,Y=%.2f" %(point.x(),point.y())) #状态栏显示
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(200) def chart_init(self): self.chart = QChart() self.series = QSplineSeries() #设置曲线名称 self.series.setName("实时数据") #把曲线添加到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("量程") #设置网格不显示 self.vlaxisY.setGridLineVisible(False) #把坐标轴添加到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)
class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self, weight_path, out_file_path, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.setWindowTitle("VAT ROLL COMPARE LABEL TOOL" + " " + CODE_VER) self.showMaximized() '''按键绑定''' # 输入媒体 self.import_media_pushButton.clicked.connect(self.import_media) # 导入 self.start_predict_pushButton.clicked.connect( self.predict_button_click) # 开始推理 # 输出媒体 self.open_predict_file_pushButton.clicked.connect( self.open_file_in_browser) # 文件中显示推理视频 # 下方 self.play_pushButton.clicked.connect( self.play_pause_button_click) # 播放 self.pause_pushButton.clicked.connect( self.play_pause_button_click) # 暂停 self.button_dict = dict() self.button_dict.update({ "import_media_pushButton": self.import_media_pushButton, "start_predict_pushButton": self.start_predict_pushButton, "open_predict_file_pushButton": self.open_predict_file_pushButton, "play_pushButton": self.play_pushButton, "pause_pushButton": self.pause_pushButton, }) '''媒体流绑定输出''' self.input_player = QMediaPlayer() # 媒体输入的widget self.input_player.setVideoOutput(self.input_video_widget) self.input_player.positionChanged.connect( self.change_slide_bar) # 播放进度条 self.output_player = QMediaPlayer() # 媒体输出的widget self.output_player.setVideoOutput(self.output_video_widget) '''初始化GPU chart''' self.series = QSplineSeries() self.chart_init() '''初始化GPU定时查询定时器''' # 使用QTimer,0.5秒触发一次,更新数据 self.timer = QTimer(self) self.timer.timeout.connect(self.draw_gpu_info_chart) self.timer.start(500) # 播放时长, 以 input 的时长为准 self.video_length = 0 self.out_file_path = out_file_path # 推理使用另外一线程 self.predict_handler_thread = PredictHandlerThread( self.output_player, self.out_file_path, weight_path, self.predict_info_plainTextEdit, self.predict_progressBar, self.fps_label, self.button_dict) # 界面美化 self.gen_better_gui() def gen_better_gui(self): """ 美化界面 :return: """ # Play 按钮 play_icon = QIcon() play_icon.addPixmap(QPixmap("./UI/icon/play.png"), QIcon.Normal, QIcon.Off) self.play_pushButton.setIcon(play_icon) # Pause 按钮 play_icon = QIcon() play_icon.addPixmap(QPixmap("./UI/icon/pause.png"), QIcon.Normal, QIcon.Off) self.pause_pushButton.setIcon(play_icon) def chart_init(self): """ 初始化 GPU 折线图 :return: """ # self.gpu_info_chart._chart = QChart(title="折线图堆叠") # 创建折线视图 self.gpu_info_chart._chart = QChart() # 创建折线视图 # chart._chart.setBackgroundVisible(visible=False) # 背景色透明 self.gpu_info_chart._chart.setBackgroundBrush(QBrush( QColor("#FFFFFF"))) # 改变图背景色 # 设置曲线名称 self.series.setName("GPU Utilization") # 把曲线添加到QChart的实例中 self.gpu_info_chart._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(100) # 设置X轴时间样式 self.dtaxisX.setFormat("hh:mm:ss") # 设置坐标轴上的格点 self.dtaxisX.setTickCount(5) self.vlaxisY.setTickCount(10) # 设置坐标轴名称 self.dtaxisX.setTitleText("Time") self.vlaxisY.setTitleText("Percent") # 设置网格不显示 self.vlaxisY.setGridLineVisible(False) # 把坐标轴添加到chart中 self.gpu_info_chart._chart.addAxis(self.dtaxisX, Qt.AlignBottom) self.gpu_info_chart._chart.addAxis(self.vlaxisY, Qt.AlignLeft) # 把曲线关联到坐标轴 self.series.attachAxis(self.dtaxisX) self.series.attachAxis(self.vlaxisY) # 生成 折线图 self.gpu_info_chart.setChart(self.gpu_info_chart._chart) def draw_gpu_info_chart(self): """ 绘制 GPU 折线图 :return: """ # 获取当前时间 time_current = QDateTime.currentDateTime() # 更新X轴坐标 self.dtaxisX.setMin(QDateTime.currentDateTime().addSecs(-300 * 1)) self.dtaxisX.setMax(QDateTime.currentDateTime().addSecs(0)) # 当曲线上的点超出X轴的范围时,移除最早的点 remove_count = 600 if self.series.count() > remove_count: self.series.removePoints(0, self.series.count() - remove_count) # 对 y 赋值 # yint = random.randint(0, 100) gpu_info = get_gpu_info() yint = gpu_info[0].get("gpu_load") # 添加数据到曲线末端 self.series.append(time_current.toMSecsSinceEpoch(), yint) def import_media(self): """ 导入媒体文件 :return: """ self.parameter_source = QFileDialog.getOpenFileUrl()[0] self.input_player.setMedia(QMediaContent( self.parameter_source)) # 选取视频文件 # 设置 output 为一张图片,防止资源被占用 path_current = str(Path.cwd().joinpath("area_dangerous\1.jpg")) self.output_player.setMedia( QMediaContent(QUrl.fromLocalFile(path_current))) # 将 QUrl 路径转为 本地路径str self.predict_handler_thread.parameter_source = self.parameter_source.toLocalFile( ) self.input_player.pause() # 显示媒体 image_flag = os.path.splitext( self.predict_handler_thread.parameter_source)[-1].lower( ) in img_formats for item, button in self.button_dict.items(): if image_flag and item in ['play_pushButton', 'pause_pushButton']: button.setEnabled(False) else: button.setEnabled(True) # self.output_player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0])) # 选取视频文件 def predict_button_click(self): """ 推理按钮 :return: """ # 启动线程去调用 self.predict_handler_thread.start() def change_slide_bar(self, position): """ 进度条移动 :param position: :return: """ self.video_length = self.input_player.duration() + 0.1 self.video_horizontalSlider.setValue( round((position / self.video_length) * 100)) self.video_percent_label.setText( str(round((position / self.video_length) * 100, 2)) + '%') @pyqtSlot() def play_pause_button_click(self): """ 播放、暂停按钮回调事件 :return: """ name = self.sender().objectName() if self.parameter_source == "": return if name == "play_pushButton": print("play") self.input_player.play() self.output_player.play() elif name == "pause_pushButton": self.input_player.pause() self.output_player.pause() @pyqtSlot() def open_file_in_browser(self): os.system(f"start explorer {self.out_file_path}") @pyqtSlot() def closeEvent(self, *args, **kwargs): """ 重写关闭事件 :param args: :param kwargs: :return: """ print("Close")
class Example(QMainWindow): def __init__(self, ): super().__init__() self.bijiao = [0, 0, 0] self.res = "" self.queue = [] self.k = -1 self.flag = -1 try: self.initUI() self.chart_init(10) except: traceback.print_exc() def initUI(self): icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap("D:\\Sysytem\\Desktop\\zhong\\data\\ico.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.setWindowIcon(icon) self.resize(1000, 700) self.setWindowTitle('Icon') self.setObjectName("清华大学得不到的学生") self.setWindowTitle("一枚小乖乖~") self.label = QLabel(self) self.label.setWindowTitle("清华大学得不到的学生") self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.label.setGeometry(QtCore.QRect(15, 15, 970, self.height() - 30)) self.label.setText("") palette = QtGui.QPalette() self.label.setStyleSheet("background-color: #fff;border-radius: 15px;") self.labelshadow = QGraphicsDropShadowEffect(self) self.labelshadow.setBlurRadius(15) self.labelshadow.setOffset(1, 1) self.label.setGraphicsEffect(self.labelshadow) self.label.setScaledContents(True) self.label.setObjectName("label") self.pushButton_12 = QtWidgets.QPushButton(self) self.pushButton_12.setGeometry( QtCore.QRect(self.width() - 55, 29, 20, 20)) self.pushButton_12.setStyleSheet( "QPushButton{\n" " background:#fc625d;\n" " color:white;\n" " box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n" "}\n" "QPushButton:hover{ \n" " background:#FF2D2D;\n" "}\n" "QPushButton:pressed{\n" " border: 1px solid #3C3C3C!important;\n" " background:#AE0000;\n" "}") self.pushButton_12.clicked.connect(self.close) self.pushButton_14 = QtWidgets.QPushButton(self) self.pushButton_14.setGeometry( QtCore.QRect(self.width() - 55 - 35, 29, 20, 20)) self.pushButton_14.setStyleSheet( "QPushButton{\n" " background:#35cd4b;\n" " color:white;\n" " box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n" "}\n" "QPushButton:hover{ \n" " background:#00CC00;\n" "}\n" "QPushButton:pressed{\n" " border: 1px solid #3C3C3C!important;\n" " background:#009900;\n" "}") self.pushButton_14.clicked.connect(self.showMinimized) self.color = ["#e89291", "#c4b98b", "#81a8e1", "#8cc9c4", "#83bde2"] # -----------------------------------------------------------------测试数量------------------------ error = QtWidgets.QLineEdit(self) error.setGeometry(QtCore.QRect(70, 70, 150, 50)) error.setStyleSheet( "text-align: center;background-color: " + self.color[0] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) errorshadow = QGraphicsDropShadowEffect(self) error.setPlaceholderText("测试数量") errorshadow.setBlurRadius(30) cl = QColor("#cacaca") errorshadow.setColor(cl) error.setAlignment(Qt.AlignCenter) errorshadow.setOffset(0, 0) error.textChanged.connect(self.set_suliang) # error.setGraphicsEffect(errorshadow) # -----------------------------------------------------------------随机范围------------------------ fan = QtWidgets.QLineEdit(self) fan.setGeometry(QtCore.QRect(240, 70, 150, 50)) fan.setStyleSheet( "text-align: center;background-color: " + self.color[2] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) fanshadow = QGraphicsDropShadowEffect(self) fanshadow.setBlurRadius(30) fancl = QColor("#cacaca") fan.setPlaceholderText("随机范围") fanshadow.setColor(fancl) fan.setAlignment(Qt.AlignCenter) fanshadow.setOffset(0, 0) fan.textChanged.connect(self.set_fanwei) # fan.setGraphicsEffect(fanshadow) # -----------------------------------------------------------------内存块数----------------------- kuai = QtWidgets.QLineEdit(self) kuai.setGeometry(QtCore.QRect(410, 70, 150, 50)) kuai.setStyleSheet( "text-align: center;background-color: " + self.color[3] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) kuaishadow = QGraphicsDropShadowEffect(self) kuaishadow.setBlurRadius(30) kuaicl = QColor("#cacaca") kuai.setPlaceholderText("内存块数") kuaishadow.setColor(kuaicl) kuai.setAlignment(Qt.AlignCenter) kuaishadow.setOffset(0, 0) kuai.textChanged.connect(self.set_kuai) # kuai.setGraphicsEffect(kuaishadow) self.Button = QtWidgets.QPushButton(self) self.Button.setGeometry(QtCore.QRect(580, 70, 150, 50)) self.Button.setStyleSheet( "QPushButton{text-align: center;background-color: #83bde2;" "border-radius: 7px;border: 0px solid #000;color:#ffffff;" "font-size:20px;font-family: 微软雅黑;}" + "QPushButton:hover{ " + " background-color: #9ad0d0;color: white;" + "}") Buttonshadow = QGraphicsDropShadowEffect(self) Buttonshadow.setBlurRadius(30) Buttoncl = QColor("#cacaca") self.Button.setText("执行") Buttonshadow.setColor(Buttoncl) Buttonshadow.setOffset(0, 0) # Button.setGraphicsEffect(Buttonshadow) self.Button.clicked.connect(self.on_click_start) self.avgflag = 0 self.qq = QtWidgets.QPushButton(self) self.qq.setGeometry(QtCore.QRect(750, 70, 180, 50)) self.qq.setStyleSheet( "color: #000;text-align: center;background-color: #f0f0f0;border-radius: 7px;border: 0px solid #000;font-size:14px;font-family: 微软雅黑;" ) self.qq.clicked.connect(self.on_avg) self.show() def on_avg(self): if self.avgflag == 0: self.series.hide() self.serieslru.hide() self.seriesopt.hide() self.seriesfifoavg.show() self.serieslruavg.show() self.seriesoptavg.show() self.avgflag = 1 else: self.series.show() self.serieslru.show() self.seriesopt.show() self.seriesfifoavg.hide() self.serieslruavg.hide() self.seriesoptavg.hide() self.avgflag = 0 def set_kuai(self, text): self.kuai = text def set_fanwei(self, text): self.fan = text def set_suliang(self, text): self.su = text def hideerror(self): self.error.hide() def set_kuaishu(self, text): self.kuaishu = text def set_yemian(self, text): self.yemian = text def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate def mousePressEvent(self, e): if e.button() == Qt.LeftButton: self.m_drag = True self.m_DragPosition = e.globalPos() - self.pos() e.accept() def mouseReleaseEvent(self, e): if e.button() == Qt.LeftButton: self.m_drag = False def mouseMoveEvent(self, e): try: if Qt.LeftButton and self.m_drag: self.move(e.globalPos() - self.m_DragPosition) e.accept() except: print("错误代码:000x0") def on_click_start(self): try: self.jishu = 0 self.thread = MyThread() self.thread.set_su(self.su) self.thread.set_kuai(self.kuai) self.thread.set_x(self.dtaxisX) self.thread.set_fan(self.fan) self.thread.det_bijiao(self.bijiao) self.dailist = [] self.avg = [] self.avg1 = [] self.avg2 = [] self.dailistlru = [] self.dailistopt = [] self.thread.sinOut.connect(self.change) self.thread.start() # self.qq.setText("FIFO:%0.2f LRU:%0.2f \n OPT:%0.2f" % (self.bijiao[0], self.bijiao[1], self.bijiao[2])) except: traceback.print_exc() # self.sinOut.emit(self.dailist) # self.sinOut2.emit(self.dailistlru) # self.sinOut3.emit(self.dailistopt) def change(self, dailist): try: # print(dailist) # arr = str.split(dailist) # print(arr) flag = 0 start = 0 flag = dailist.find(" ", flag) flag = dailist.find(" ", flag + 1) end = flag arr = str.split(dailist[start:end]) start = flag flag = dailist.find(" ", flag + 1) flag = dailist.find(" ", flag + 1) end = flag arr1 = str.split(dailist[start:end]) start = flag flag = dailist.find(" ", flag + 1) flag = dailist.find(" ", flag + 1) end = flag arr2 = str.split(dailist[start:end]) self.dailist.append(QPointF(float(arr[0]), float(arr[1]))) self.dailistlru.append(QPointF(float(arr1[0]), float(arr1[1]))) self.dailistopt.append(QPointF(float(arr2[0]), float(arr2[1]))) # self.series.replace(self.dailist) self.serieslru.replace(self.dailistlru) self.seriesopt.replace(self.dailistopt) if self.jishu == 0: self.bijiao[0] = float(arr[1]) self.bijiao[1] = float(arr1[1]) self.bijiao[2] = float(arr2[1]) self.jishu = 1 else: self.bijiao[0] = (float(arr[1]) + self.bijiao[0]) / 2.0 self.bijiao[1] = (float(arr1[1]) + self.bijiao[1]) / 2.0 self.bijiao[2] = (float(arr2[1]) + self.bijiao[2]) / 2.0 self.jishu = self.jishu + 1 self.avg.append(QPointF(float(arr[0]), self.bijiao[0])) self.avg1.append(QPointF(float(arr[0]), self.bijiao[1])) self.avg2.append(QPointF(float(arr[0]), self.bijiao[2])) # print(self.avg) self.seriesfifoavg.replace(self.avg) self.serieslruavg.replace(self.avg1) self.seriesoptavg.replace(self.avg2) self.qq.setText("FIFO:%0.2f LRU:%0.2f \n OPT:%0.2f" % (self.bijiao[0], self.bijiao[1], self.bijiao[2])) except: traceback.print_exc() def drawLine(self): self.series.replace(self.dailist) # print("uiy") def chart_init(self, su): self.start_num = 0 self.chart = QChartView(self) self.chart.setGeometry(50, 150, self.width() - 100, self.height() - 150 - 50) # 设置charView位置、大小 self.series = QSplineSeries() self.series.setName("FIFO") self.chart.chart().addSeries(self.series) pen = QPen(Qt.gray) pen.setWidth(2) self.serieslru = QSplineSeries() self.serieslru.setPen(pen) self.serieslru.setName("LRU") self.serieslru.setColor(QColor("#e89291")) self.chart.chart().addSeries(self.serieslru) pen2 = QPen(Qt.gray) pen2.setWidth(2) self.seriesopt = QSplineSeries() self.seriesopt.setPen(pen2) self.seriesopt.setColor(QColor("#3ea54f")) self.seriesopt.setName("OPT") self.chart.chart().addSeries(self.seriesopt) penfifo = QPen(Qt.gray) penfifo.setWidth(2) self.seriesfifoavg = QSplineSeries() self.seriesfifoavg.setPen(penfifo) self.seriesfifoavg.setName("FIFO-avg") self.seriesfifoavg.setColor(QColor("#209fdf")) self.chart.chart().addSeries(self.seriesfifoavg) self.seriesfifoavg.hide() penavg = QPen(Qt.gray) penavg.setWidth(2) self.serieslruavg = QSplineSeries() self.serieslruavg.setPen(penavg) self.serieslruavg.setName("LRU-avg") self.serieslruavg.setColor(QColor("#e89291")) self.chart.chart().addSeries(self.serieslruavg) self.serieslruavg.hide() pen2avg = QPen(Qt.gray) pen2avg.setWidth(2) self.seriesoptavg = QSplineSeries() self.seriesoptavg.setPen(pen2avg) self.seriesoptavg.setColor(QColor("#3ea54f")) self.seriesoptavg.setName("OPT-avg") self.chart.chart().addSeries(self.seriesoptavg) self.seriesoptavg.hide() self.dtaxisX = QValueAxis() self.vlaxisY = QValueAxis() self.dtaxisX.setMin(10) self.dtaxisX.setMax(100) self.vlaxisY.setMin(0) self.vlaxisY.setMax(100) self.dtaxisX.setTickCount(6) self.vlaxisY.setTickCount(11) self.dtaxisX.setTitleText("页数") self.vlaxisY.setTitleText("缺页率") self.vlaxisY.setGridLineVisible(False) self.chart.chart().addAxis(self.dtaxisX, Qt.AlignBottom) self.chart.chart().addAxis(self.vlaxisY, Qt.AlignLeft) self.series.attachAxis(self.dtaxisX) self.series.attachAxis(self.vlaxisY) self.serieslru.attachAxis(self.dtaxisX) self.serieslru.attachAxis(self.vlaxisY) self.seriesopt.attachAxis(self.dtaxisX) self.seriesopt.attachAxis(self.vlaxisY) self.seriesoptavg.attachAxis(self.dtaxisX) self.seriesoptavg.attachAxis(self.vlaxisY) self.serieslruavg.attachAxis(self.dtaxisX) self.serieslruavg.attachAxis(self.vlaxisY) self.seriesfifoavg.attachAxis(self.dtaxisX) self.seriesfifoavg.attachAxis(self.vlaxisY) self.chart.chart().setTitleBrush(QBrush(Qt.cyan)) cc = QColor("#f0f0f0") self.chart.setBackgroundBrush(cc) self.chart.setStyleSheet( "QChartView{ background-color: #83bde2;border-radius: 20px;}") self.chart.show()