def ALL(self): self.ind = 0 set0 = QBarSet('Daya Tarik') set1 = QBarSet('Aksesbilitas') set2 = QBarSet('Kebersihan') set3 = QBarSet('Fasilitas') set0.setColor(QtGui.QColor("blue")) set1.setColor(QtGui.QColor("red")) set2.setColor(QtGui.QColor("green")) set3.setColor(QtGui.QColor("orange")) gf = Grafik_2() jml = gf.jumlah_per_pantai() jml_pantai = [] for i in range(len(jml)): jml_pantai.append(jml[i]) hasil = gf.hasil_dayatarik() for i in range(len(hasil)): set0.append((hasil[i] / jml_pantai[i]) * 100) hasil2 = gf.hasil_aksesbilitas() for i in range(len(hasil2)): set1.append((hasil2[i] / jml_pantai[i]) * 100) hasil3 = gf.hasil_kebersihan() for i in range(len(hasil3)): set2.append((hasil3[i] / jml_pantai[i]) * 100) hasil4 = gf.hasil_fasilitas() for i in range(len(hasil4)): set3.append((hasil4[i] / jml_pantai[i]) * 100) series = QBarSeries() series.append(set0) series.append(set1) series.append(set2) series.append(set3) series.setLabelsVisible(True) series.setLabelsPosition(QAbstractBarSeries.LabelsInsideEnd) series.setLabelsAngle(-90) self.chart = QChart() self.chart.addSeries(series) self.chart.setTitle('Grafik Prosentase Ulasan Pantai') self.chart.setAnimationOptions(QChart.SeriesAnimations) axisY = QValueAxis() axisY.setTitleText("Prosentase (%)") axisY.applyNiceNumbers() self.chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chart.createDefaultAxes() self.graphicsView.setChart(self.chart) self.adjust_axes(0, 2) self.lims = np.array([0, 6]) self.onAxisSliderMoved(self.verticalScrollBar.value())
def update_axes(self): # Get and remove all axes for axis in self.chart.axes(): self.chart.removeAxis(axis) # Create new axes # Create axis X # axisX = QDateTimeAxis() # axisX.setTickCount(5) # axisX.setFormat("dd MMM yyyy") # axisX.setTitleText("Date") # self.chart.addAxis(axisX, Qt.AlignBottom) # axisX.rangeChanged.connect(self.axis_range_changed) axisX = QValueAxis() axisX.setTickCount(10) axisX.setLabelFormat("%li") axisX.setTitleText("Seconds") self.chart.addAxis(axisX, Qt.AlignBottom) # axisX.rangeChanged.connect(self.axis_range_changed) # Create axis Y axisY = QValueAxis() axisY.setTickCount(5) axisY.setLabelFormat("%.3f") axisY.setTitleText("Values") self.chart.addAxis(axisY, Qt.AlignLeft) # axisY.rangeChanged.connect(self.axis_range_changed) ymin = None ymax = None # Attach axes to series, find min-max for series in self.chart.series(): series.attachAxis(axisX) series.attachAxis(axisY) vect = series.pointsVector() for i in range(len(vect)): if ymin is None: ymin = vect[i].y() ymax = vect[i].y() else: ymin = min(ymin, vect[i].y()) ymax = max(ymax, vect[i].y()) # Update range # print('min max', ymin, ymax) if ymin is not None: axisY.setRange(ymin, ymax) # Make the X,Y axis more readable axisX.applyNiceNumbers()
def __init__(self): super().__init__() self.resize(800, 600) set0 = QBarSet('X0') set1 = QBarSet('X1') set2 = QBarSet('X2') set3 = QBarSet('X3') set4 = QBarSet('X4') set0.append([1, 2, 3, 4, 5, 6]) set1.append([5, 0, 0, 4, 0, 7]) set2.append([3, 5, 8, 13, 8, 5]) set3.append([5, 6, 7, 3, 4, 5]) set4.append([9, 7, 5, 3, 1, 2]) series = QHorizontalBarSeries() series.append(set0) series.append(set1) series.append(set2) series.append(set3) series.append(set4) chart = QChart() chart.addSeries(series) chart.setTitle('Horizontal Bar Chart Demo') chart.setAnimationOptions(QChart.SeriesAnimations) months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June') axisY = QBarCategoryAxis() axisY.append(months) chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) axisX = QValueAxis() chart.addAxis(axisX, Qt.AlignBottom) series.attachAxis(axisX) axisX.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chartView = QChartView(chart) chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chartView)
def DT(self): self.ind = 1 gf = Grafik_2() jml = gf.jumlah_per_pantai() jml_pantai = [] for i in range(len(jml)): jml_pantai.append(jml[i]) value = [] hasil = gf.hasil_dayatarik() for i in range(len(hasil)): value.append((hasil[i] / jml_pantai[i]) * 100) sorting = sorted(value, reverse=True) index = np.argsort(value)[::-1] label_sorting = [] for i in index: label_sorting.append(self.label_pantai[i]) set0 = QBarSet('Daya Tarik') set0.setColor(QtGui.QColor("blue")) for i in range(len(hasil)): set0.append(sorting) series = QBarSeries() series.append(set0) series.setLabelsVisible(True) series.setLabelsPosition(QAbstractBarSeries.LabelsInsideEnd) self.chart = QChart() self.chart.addSeries(series) self.chart.setTitle('Grafik Prosentase Ulasan Pantai') self.chart.setAnimationOptions(QChart.SeriesAnimations) axisX = QBarCategoryAxis() axisX.setLabelsAngle(-90) axisY = QValueAxis() axisY.setTitleText("Prosentase (%)") self.chart.addAxis(axisX, Qt.AlignBottom) self.chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) axisY.applyNiceNumbers() self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chart.createDefaultAxes() self.graphicsView.setChart(self.chart) self.lims = np.array([0, 10]) self.onAxisSliderMoved(self.verticalScrollBar.value())
def KB(self): self.ind = 3 gf = Grafik_2() jml = gf.jumlah_per_pantai() jml_pantai = [] for i in range(len(jml)): jml_pantai.append(jml[i]) value = [] hasil = gf.hasil_kebersihan() for i in range(len(hasil)): value.append((hasil[i] / jml_pantai[i]) * 100) sorting = sorted(value, reverse=True) set0 = QBarSet('Kebersihan') set0.setColor(QtGui.QColor("green")) for i in range(len(hasil)): set0.append(sorting) series = QBarSeries() series.append(set0) series.setLabelsVisible(True) series.setLabelsPosition(QAbstractBarSeries.LabelsInsideEnd) self.chart = QChart() self.chart.addSeries(series) self.chart.setTitle('Grafik Prosentase Ulasan Pantai') self.chart.setAnimationOptions(QChart.SeriesAnimations) axisY = QValueAxis() axisY.setTitleText("Prosentase (%)") axisY.applyNiceNumbers() self.chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chart.createDefaultAxes() self.graphicsView.setChart(self.chart) self.adjust_axes(0, 2) self.lims = np.array([0, 10]) self.onAxisSliderMoved(self.verticalScrollBar.value())
def create_graph(self): self.emotion_set = QBarSet('Confidence Level') self.emotion_set.append([ self.face_anger_digust, self.face_happy, self.face_neutral, self.face_sadness, self.face_surprise_fear ]) series = QHorizontalBarSeries() series.append(self.emotion_set) chart = QChart() chart.addSeries(series) chart.setTitle('ReLuu FaceReader') chart.setAnimationOptions(QChart.SeriesAnimations) months = ('Angery and Disgusted', 'Happy', 'Neutral', 'Sadness', 'Fear and Surprise') axisY = QBarCategoryAxis() axisY.append(months) chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) axisX = QValueAxis() axisX.setMax(1.0) chart.addAxis(axisX, Qt.AlignBottom) series.attachAxis(axisX) axisX.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chartView = QChartView(chart) chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chartView)
def run_statistics(self): text = self.comp_type_crt_text x_vals = [] y_vals = [] if text[:5] == "Inter": data_sets = [] for check_box in self.check_boxes: if check_box.isChecked(): data_sets.append(self.check_boxes[check_box]) metric = self.select_metric_inter.currentText() metric_alias = self.dict_metric_inter[metric] res = ResultsManager.get_results_inter(metric_alias, data_sets) # self.graphWidget.plot(data_sets, res) x_vals = data_sets y_vals = res elif text[:5] == "Intra": ds_name = self.intra_ds_current metric = self.select_metric_intra.currentText() metric_alias = self.dict_metric_intra[metric] names, res = ResultsManager.get_results_intra(metric_alias, ds_name) # self.graphWidget.plot(names, res) x_vals = names y_vals = res #horizontal bar chart_view = None if self.select_chart.currentIndex() == 0: chart = QChart(flags=Qt.WindowFlags()) series = QHorizontalBarSeries() for i in range(len(x_vals)): name = x_vals[i] set0 = QBarSet(name) set0.append(y_vals[i]) series.append(set0) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view axisX = QValueAxis() chart.addAxis(axisX, Qt.AlignBottom) series.attachAxis(axisX) axisX.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) # vertical bar elif self.select_chart.currentIndex() == 1: chart = QChart(flags=Qt.WindowFlags()) series = QBarSeries() for i in range(len(x_vals)): name = x_vals[i] set0 = QBarSet(name) set0.append(y_vals[i]) series.append(set0) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view axisY = QValueAxis() chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) axisY.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) # pie chart elif self.select_chart.currentIndex() == 2: chart = QChart(flags=Qt.WindowFlags()) series = QPieSeries() for i in range(len(x_vals)): series.append(x_vals[i], y_vals[i]) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart.legend().setAlignment(Qt.AlignBottom) # chart.legend().setFont(QFont("Arial", 12)) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) chart_view.setRubberBand(QChartView.HorizontalRubberBand) chart_view.setRubberBand(QChartView.VerticalRubberBand)
def analysisUI(self, smwui): btn_refresh = QPushButton('Refresh') btn_refresh.clicked.connect(smwui.update_chart) smwui.cb_targetAxis1 = QCheckBox('X : Horizontal action') smwui.cb_targetAxis1.setChecked(True) smwui.cb_targetAxis1.stateChanged.connect(smwui.update_chart) smwui.cb_targetAxis2 = QCheckBox('Y : Vertical action') smwui.cb_targetAxis2.setChecked(True) smwui.cb_targetAxis2.stateChanged.connect(smwui.update_chart) smwui.cb_targetAxis3 = QCheckBox('Z : Depth action') smwui.cb_targetAxis3.setChecked(True) smwui.cb_targetAxis3.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue1 = QCheckBox('Head') smwui.cb_targetValue1.setChecked(True) smwui.cb_targetValue2 = QCheckBox('ShoulderRight') smwui.cb_targetValue3 = QCheckBox('ElbowRight') smwui.cb_targetValue4 = QCheckBox('HandRight') smwui.cb_targetValue4.setChecked(True) smwui.cb_targetValue5 = QCheckBox('SpineBase') smwui.cb_targetValue6 = QCheckBox('HandLeft') smwui.cb_targetValue6.setChecked(True) smwui.cb_targetValue7 = QCheckBox('ElbowLeft') smwui.cb_targetValue8 = QCheckBox('ShoulderLeft') smwui.cb_targetValue9 = QCheckBox('Neck') smwui.cb_targetValue1.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue2.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue3.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue4.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue5.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue6.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue7.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue8.stateChanged.connect(smwui.update_chart) smwui.cb_targetValue9.stateChanged.connect(smwui.update_chart) ### chart set1 = QBarSet("X") set2 = QBarSet("Y") set3 = QBarSet("Z") set1.setColor(QColor(0, 0, 200, 150)) set2.setColor(QColor(0, 200, 0, 150)) set3.setColor(QColor(200, 50, 0, 150)) series = QHorizontalBarSeries() series.append(set1) series.append(set2) series.append(set3) categories = [] categories.append('Parts') axisX = QValueAxis() axisX.applyNiceNumbers() axisY = QBarCategoryAxis() axisY.append(categories) chart = QChart() chart.addSeries(series) chart.setTitle("Timeseries Distance") chart.setAnimationOptions(QChart.SeriesAnimations) chart.setAxisX(axisX, series) chart.setAxisY(axisY) chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignTop) smwui.chartView = QChartView(chart) smwui.chartView.setRenderHint(QPainter.Antialiasing) ### draw parts smwui.viewParts = QQuickWidget() smwui.viewParts.setSource(QUrl("./qml/qmlptviewer/main.qml")) smwui.viewParts.rootContext().setContextProperty( "HandRight", "0,0,0,0") smwui.viewParts.rootContext().setContextProperty("HandLeft", "0,0,0,0") smwui.viewParts.rootContext().setContextProperty( "ElbowRight", "0,0,0,0") smwui.viewParts.rootContext().setContextProperty( "ElbowLeft", "0,0,0,0") smwui.viewParts.rootContext().setContextProperty("Head", "0,0,0,0") scrollArea_viewParts = QScrollArea() scrollArea_viewParts.setMinimumWidth(420) scrollArea_viewParts.setWidget(smwui.viewParts) scrollArea_viewParts.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) ### |1| vbox1 = QVBoxLayout() vbox1.addWidget(smwui.cb_targetAxis1) vbox1.addWidget(smwui.cb_targetAxis2) vbox1.addWidget(smwui.cb_targetAxis3) gb_targetAxis = QGroupBox() gb_targetAxis.setTitle('Axis') gb_targetAxis.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum) gb_targetAxis.setLayout(vbox1) ### |2| vbox2 = QVBoxLayout() vbox2.addWidget(smwui.cb_targetValue1) vbox2.addWidget(smwui.cb_targetValue2) vbox2.addWidget(smwui.cb_targetValue3) vbox2.addWidget(smwui.cb_targetValue4) vbox2.addWidget(smwui.cb_targetValue5) vbox2.addWidget(smwui.cb_targetValue6) vbox2.addWidget(smwui.cb_targetValue7) vbox2.addWidget(smwui.cb_targetValue8) vbox2.addWidget(smwui.cb_targetValue9) gb_targetValue = QGroupBox() gb_targetValue.setTitle('Parts') gb_targetValue.setLayout(vbox2) vbox3 = QVBoxLayout() vbox3.addWidget(btn_refresh) vbox3.addWidget(gb_targetAxis) vbox3.addWidget(gb_targetValue) ### -1- hbox = QHBoxLayout() hbox.addLayout(vbox3) hbox.addWidget(smwui.chartView) hbox.addWidget(scrollArea_viewParts) self.gb_analysis.setTitle("Analysis") self.gb_analysis.setLayout(hbox)
def update_chart(self): if not self.cb_targetAxis1.checkState( ) and not self.cb_targetAxis2.checkState( ) and not self.cb_targetAxis3.checkState(): return -1 ## draw chart set1 = QBarSet("X") set2 = QBarSet("Y") set3 = QBarSet("Z") set1.setColor(QColor(0, 0, 200, 180)) set2.setColor(QColor(0, 200, 0, 180)) set3.setColor(QColor(200, 100, 0, 180)) self.categories = [] self.set1_val = np.array([]) self.set2_val = np.array([]) self.set3_val = np.array([]) for i in range(len(self.parts_dict)): flag_add = False if self.parts_dict[self.cb_targetValue1.text( )] == i and self.cb_targetValue1.checkState(): flag_add = True self.categories.append(self.cb_targetValue1.text()) elif self.parts_dict[self.cb_targetValue2.text( )] == i and self.cb_targetValue2.checkState(): flag_add = True self.categories.append(self.cb_targetValue2.text()) elif self.parts_dict[self.cb_targetValue3.text( )] == i and self.cb_targetValue3.checkState(): flag_add = True self.categories.append(self.cb_targetValue3.text()) elif self.parts_dict[self.cb_targetValue4.text( )] == i and self.cb_targetValue4.checkState(): flag_add = True self.categories.append(self.cb_targetValue4.text()) elif self.parts_dict[self.cb_targetValue5.text( )] == i and self.cb_targetValue5.checkState(): flag_add = True self.categories.append(self.cb_targetValue5.text()) elif self.parts_dict[self.cb_targetValue6.text( )] == i and self.cb_targetValue6.checkState(): flag_add = True self.categories.append(self.cb_targetValue6.text()) elif self.parts_dict[self.cb_targetValue7.text( )] == i and self.cb_targetValue7.checkState(): flag_add = True self.categories.append(self.cb_targetValue7.text()) elif self.parts_dict[self.cb_targetValue8.text( )] == i and self.cb_targetValue8.checkState(): flag_add = True self.categories.append(self.cb_targetValue8.text()) elif self.parts_dict[self.cb_targetValue9.text( )] == i and self.cb_targetValue9.checkState(): flag_add = True self.categories.append(self.cb_targetValue9.text()) if flag_add: set1 << self.ctd.distanceList[0 + 3 * i] set2 << self.ctd.distanceList[1 + 3 * i] set3 << self.ctd.distanceList[2 + 3 * i] self.set1_val = np.append(self.set1_val, [self.ctd.distanceList[0 + 3 * i]]) self.set2_val = np.append(self.set2_val, [self.ctd.distanceList[1 + 3 * i]]) self.set3_val = np.append(self.set3_val, [self.ctd.distanceList[2 + 3 * i]]) series = QHorizontalBarSeries() if self.cb_targetAxis1.checkState(): series.append(set1) else: self.set1_val = np.zeros(len(self.categories)) if self.cb_targetAxis2.checkState(): series.append(set2) else: self.set2_val = np.zeros(len(self.categories)) if self.cb_targetAxis3.checkState(): series.append(set3) else: self.set3_val = np.zeros(len(self.categories)) axisX = QValueAxis() axisX.applyNiceNumbers() axisY = QBarCategoryAxis() axisY.append(self.categories) chart = QChart() chart.setTitle("Timeseries Distance") chart.setAnimationOptions(QChart.SeriesAnimations) chart.addSeries(series) chart.setAxisX(axisX, series) chart.setAxisY(axisY) self.chartView.setChart(chart) self.chartView.setRenderHint(QPainter.Antialiasing) self.update_parts()
class QmyMainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) #调用父类构造函数,创建窗体 self.ui = Ui_MainWindow() #创建UI对象 self.ui.setupUi(self) #构造UI界面 self.setWindowTitle("Demo12_6, 蜡烛图、日期时间坐标轴") self.__buildStatusBar() self.ui.chartView.setRenderHint(QPainter.Antialiasing) self.ui.chartView.setCursor(Qt.CrossCursor) #设置鼠标指针为十字星 ## 初始化Model/View结构 self.itemModel = QStandardItemModel(self) self.ui.tableView.setModel(self.itemModel) self.ui.tableView.setAlternatingRowColors(True) self.ui.tableView.horizontalHeader().setDefaultSectionSize(80) self.ui.tableView.verticalHeader().setDefaultSectionSize(24) self.__iniChart() # 初始化图表 self.ui.chartView.mouseMove.connect(self.do_chartView_mouseMove) ## ==============自定义功能函数======================== def __buildStatusBar(self): self.__labChartXY = QLabel("Chart Y= ") ##状态栏显示鼠标点的坐标 self.__labChartXY.setMinimumWidth(200) self.ui.statusBar.addWidget(self.__labChartXY) self.__labHoverXY = QLabel("Hovered candle") self.__labHoverXY.setMinimumWidth(200) self.ui.statusBar.addWidget(self.__labHoverXY) self.__labClickXY = QLabel("Clicked candle") ## self.__labClickXY.setMinimumWidth(200) self.ui.statusBar.addPermanentWidget(self.__labClickXY) def __iniChart(self): self.chart = QChart() #创建 Chart self.chart.setTitle("股票日线图") self.chart.setTheme( QChart.ChartThemeBlueCerulean ) #ChartThemeBlueCerulean, ChartThemeQt,ChartThemeBlueNcs,ChartThemeDark self.ui.chartView.setChart(self.chart) #Chart添加到ChartView ## X 轴是QDateTimeAxis self.__axisX = QDateTimeAxis() dateFormat = self.ui.comboDateFormat.currentText() #如"MM-dd" self.__axisX.setFormat(dateFormat) #标签格式 self.__axisX.setTickCount(10) #主分隔个数 self.__axisX.setTitleText("日期") #标题 dateMin = QDateTime.fromString("2018-01-01", "yyyy-MM-dd") self.__axisX.setMin(dateMin) dateMax = dateMin.addDays(150) self.__axisX.setMax(dateMax) self.chart.addAxis(self.__axisX, Qt.AlignBottom) ## Y 轴是 QValueAxis self.__axisY = QValueAxis() self.__axisY.setTitleText("Value") self.__axisY.setRange(0, 20) self.__axisY.setTickCount(5) self.__axisY.setLabelFormat("%.2f") #标签格式 self.chart.addAxis(self.__axisY, Qt.AlignLeft) def __loadData(self, allLines): ##从字符串列表读取数据构建数据模型 rowCount = len(allLines) #文本行数,第1行是标题 self.itemModel.setRowCount(rowCount - 1) #实际数据行数 ## 设置表头 header = allLines[0].strip() #第1行是表头 headerList = header.split() self.itemModel.setHorizontalHeaderLabels(headerList) #设置表头文字 colCount = len(headerList) #列数 self.itemModel.setColumnCount(colCount) #数据列数 ## 设置模型数据 for i in range(rowCount - 1): lineText = allLines[i + 1].strip() #获取 数据区 的一行 tmpList = lineText.split() for j in range(colCount): item = QStandardItem(tmpList[j]) #创建item item.setTextAlignment(Qt.AlignHCenter) self.itemModel.setItem(i, j, item) #为模型的某个行列位置设置Item def __drawChart(self): ##绘制图表 self.chart.removeAllSeries() #删除所有序列 self.chart.setTitle("股票日线图--" + self.ui.tabWidget.tabText(0)) ## 1. 创建蜡烛图 seriesCandle = QCandlestickSeries() seriesCandle.setName("蜡烛图") seriesCandle.setIncreasingColor(Qt.red) #暴涨 seriesCandle.setDecreasingColor(Qt.darkGreen) #暴跌 visible = self.ui.chkBox_Outline.isChecked() seriesCandle.setBodyOutlineVisible(visible) seriesCandle.setCapsVisible(self.ui.chkBox_Caps.isChecked()) self.chart.addSeries(seriesCandle) seriesCandle.attachAxis(self.__axisX) seriesCandle.attachAxis(self.__axisY) seriesCandle.clicked.connect(self.do_candleClicked) seriesCandle.hovered.connect(self.do_candleHovered) ## 2. 创建MA曲线 pen = QPen() pen.setWidth(2) seriesMA1 = QLineSeries() #不能使用QSplineSeries seriesMA1.setName("MA5") pen.setColor(Qt.magenta) seriesMA1.setPen(pen) self.chart.addSeries(seriesMA1) seriesMA1.attachAxis(self.__axisX) seriesMA1.attachAxis(self.__axisY) seriesMA2 = QLineSeries() seriesMA2.setName("MA10") pen.setColor(Qt.yellow) seriesMA2.setPen(pen) self.chart.addSeries(seriesMA2) seriesMA2.attachAxis(self.__axisX) seriesMA2.attachAxis(self.__axisY) seriesMA3 = QLineSeries() seriesMA3.setName("MA20") pen.setColor(Qt.cyan) seriesMA3.setPen(pen) self.chart.addSeries(seriesMA3) seriesMA3.attachAxis(self.__axisX) seriesMA3.attachAxis(self.__axisY) seriesMA4 = QLineSeries() seriesMA4.setName("MA60") pen.setColor(Qt.green) #green seriesMA4.setPen(pen) self.chart.addSeries(seriesMA4) seriesMA4.attachAxis(self.__axisX) seriesMA4.attachAxis(self.__axisY) ## 3. 填充数据到序列 dataRowCount = self.itemModel.rowCount() #数据点个数 for i in range(dataRowCount): dateStr = self.itemModel.item(i, 0).text() #日期字符串,如"2017/02/03" dateValue = QDate.fromString(dateStr, "yyyy/MM/dd") #QDate dtValue = QDateTime(dateValue) #日期时间 QDateTime timeStamp = dtValue.toMSecsSinceEpoch() #毫秒数 oneCandle = QCandlestickSet() #QCandlestickSet oneCandle.setOpen(float(self.itemModel.item(i, 1).text())) #开盘 oneCandle.setHigh(float(self.itemModel.item(i, 2).text())) #最高 oneCandle.setLow(float(self.itemModel.item(i, 3).text())) #最低 oneCandle.setClose(float(self.itemModel.item(i, 4).text())) #收盘 oneCandle.setTimestamp(timeStamp) #时间戳 seriesCandle.append(oneCandle) #添加到序列 M1 = float(self.itemModel.item(i, 5).text()) M2 = float(self.itemModel.item(i, 6).text()) M3 = float(self.itemModel.item(i, 7).text()) M4 = float(self.itemModel.item(i, 8).text()) seriesMA1.append(timeStamp, M1) seriesMA2.append(timeStamp, M2) seriesMA3.append(timeStamp, M3) seriesMA4.append(timeStamp, M4) ## 4. 设置坐标轴范围 minDateStr = self.itemModel.item(0, 0).text() #日期字符串,如"2017/02/03" minDate = QDate.fromString(minDateStr, "yyyy/MM/dd") #QDate minDateTime = QDateTime(minDate) #最小日期时间,QDateTime maxDateStr = self.itemModel.item(dataRowCount - 1, 0).text() #日期字符串,如"2017/05/03" maxDate = QDate.fromString(maxDateStr, "yyyy/MM/dd") maxDateTime = QDateTime(maxDate) #最大日期时间 self.__axisX.setRange(minDateTime, maxDateTime) #日期时间范围 dateFormat = self.ui.comboDateFormat.currentText() #格式,如"MM-dd" self.__axisX.setFormat(dateFormat) #标签格式 self.__axisY.applyNiceNumbers() #自动 for marker in self.chart.legend().markers(): #QLegendMarker类型列表 marker.clicked.connect(self.do_LegendMarkerClicked) ## ==============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.ui.tabWidget.setTabText(0, fileInfo.baseName()) self.__loadData(allLines) # 载入数据到数据模型 self.__drawChart() # 绘制图表 self.ui.tab_Setup.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() ##图表外观控制 @pyqtSlot(int) ##主题 def on_comboTheme_currentIndexChanged(self, index): self.ui.chartView.chart().setTheme(QChart.ChartTheme(index)) @pyqtSlot(bool) ##显示图例 def on_chkBox_Legend_clicked(self, checked): self.ui.chartView.chart().legend().setVisible(checked) ## 蜡烛图 @pyqtSlot(bool) ##capsVisible def on_chkBox_Caps_clicked(self, checked): seriesCandle = self.chart.series()[0] seriesCandle.setCapsVisible(checked) @pyqtSlot(bool) ##bodyOutlineVisible def on_chkBox_Outline_clicked(self, checked): seriesCandle = self.chart.series()[0] seriesCandle.setBodyOutlineVisible(checked) ## Y轴--QValueAxis @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) ## X轴--QDateTimeAxis @pyqtSlot(str) ##标签格式 def on_comboDateFormat_currentIndexChanged(self, arg1): self.__axisX.setFormat(arg1) @pyqtSlot(int) ##分度数 def on_btnX_Ticks_valueChanged(self, arg1): self.__axisX.setTickCount(arg1) ## =============自定义槽函数=============================== def do_LegendMarkerClicked(self): marker = self.sender() #QLegendMarker marker.series().setVisible(not marker.series().isVisible()) marker.setVisible(True) alpha = 1.0 if not marker.series().isVisible(): alpha = 0.5 brush = marker.labelBrush() #QBrush color = brush.color() #QColor color.setAlphaF(alpha) brush.setColor(color) marker.setLabelBrush(brush) brush = marker.brush() color = brush.color() color.setAlphaF(alpha) brush.setColor(color) marker.setBrush(brush) pen = marker.pen() #QPen color = pen.color() color.setAlphaF(alpha) pen.setColor(color) marker.setPen(pen) if marker.type() == QLegendMarker.LegendMarkerTypeCandlestick: QMessageBox.information(self, "提示", "蜡烛图序列无法隐藏") def do_chartView_mouseMove(self, point): pt = self.chart.mapToValue(point) #QPointF 转换为图表的数值 self.__labChartXY.setText("Chart Y=%.2f" % (pt.y())) #状态栏显示 def do_candleClicked(self, dataSet): valOpen = dataSet.open() valClose = dataSet.close() valHigh = dataSet.high() valLow = dataSet.low() price = "开盘%.2f, 收盘%.2f, 最高%.2f, 最低%.2f" % (valOpen, valClose, valHigh, valLow) timeStamp = dataSet.timestamp() #时间戳数据 dt = QDateTime.fromMSecsSinceEpoch(timeStamp) dateStr = dt.toString("yyyy-MM-dd, ") self.__labClickXY.setText(dateStr + price) def do_candleHovered(self, status, dataSet): if status == False: self.__labHoverXY.setText("Hovered candle") return valOpen = dataSet.open() valClose = dataSet.close() valHigh = dataSet.high() valLow = dataSet.low() price = "开盘%.2f, 收盘%.2f, 最高%.2f, 最低%.2f" % (valOpen, valClose, valHigh, valLow) timeStamp = dataSet.timestamp() #时间戳数据 dt = QDateTime.fromMSecsSinceEpoch(timeStamp) dateStr = dt.toString("yyyy-MM-dd, ") self.__labHoverXY.setText(dateStr + price)