问题描述
我想在同一个 qchart 上绘制烛台和 5 天平均线,它应该显示 一个 x 轴,但给出 两个 x 轴.这是代码和情节.
导入系统从 PyQt5.QtChart 导入(QCandlestickSeries、QChart、QChartView)从 PyQt5.QtWidgets 导入 QApplication、QMainWindow从 PyQt5.QtCore 导入 Qt从 PyQt5 导入 QtChart 作为 qc"""要加载的数据如下所示:num, 打开, 高, 低, 关闭, ma51 7380 7520 7380 7510 73242 7520 7580 7410 7440 73723 7440 7650 7310 7520 74344 7450 7640 7450 7550 74805 7510 7590 7460 7490 75026 7500 7590 7480 7560 75127 7560 7830 7540 7800 7584……"""应用程序 = QApplication(sys.argv)#系列 = QCandlestickSeries()series.setDncreasingColor(Qt.red)series.setIecreasingColor(Qt.green)ma5 = qc.QLineSeries() # 5天平均数据线candle_x_axis_label = [] # 存储str类型数据# 在一个循环中,series 和 ma5 追加对应的数据对于数据中的 num、o、h、l、c、m:series.append(QCandlestickSet(o, h, l, c))ma5.append(m)蜡烛x轴标签附加(str(num))图表 = QChart()chart.addSeries(series) # 蜡烛图chart.addSeries(ma5) # ma5 线chart.setAnimationOptions(QChart.SeriesAnimations)chart.createDefaultAxes()chart.legend().hide()# 这里是重点# tm 是 str 列表,就像 '1, 2, 3, ..., n'chart.axes(Qt.Horizo??ntal)[0].setCategories(candle_x_axis_label)#chartview = QChartView(图表)ui = QMainWindow()ui.setGeometry(50, 50, 500, 300)ui.setCentralWidget(图表视图)ui.show()sys.exit(app.exec_())
和剧情
我查看qtchart代码,发现烛台x轴的类类型是QBarCategoryAxis,而ma5 x轴的类类型是QValueAxis.那么如何去除两个x轴呢?
解决方案
你只需要获取QLineSeries的X轴对应的QAbstractAxis并用
I want to plot candlestick and 5-days average line on the same qchart, it should show one x axis, but gives two x axis. here is the code and the plot.
import sys from PyQt5.QtChart import (QCandlestickSeries, QChart, QChartView) from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import Qt from PyQt5 import QtChart as qc """ data to be load just like the following: num, open, high, low, close, ma5 1 7380 7520 7380 7510 7324 2 7520 7580 7410 7440 7372 3 7440 7650 7310 7520 7434 4 7450 7640 7450 7550 7480 5 7510 7590 7460 7490 7502 6 7500 7590 7480 7560 7512 7 7560 7830 7540 7800 7584 ... ... """ app = QApplication(sys.argv) # series = QCandlestickSeries() series.setDncreasingColor(Qt.red) series.setIecreasingColor(Qt.green) ma5 = qc.QLineSeries() # 5-days average data line candle_x_axis_label = [] # stores str type data # in a loop, series and ma5 append corresponding data for num, o, h, l, c, m in data: series.append(QCandlestickSet(o, h, l, c)) ma5.append(m) candle_x_axis_label.append(str(num)) chart = QChart() chart.addSeries(series) # candle chart.addSeries(ma5) # ma5 line chart.setAnimationOptions(QChart.SeriesAnimations) chart.createDefaultAxes() chart.legend().hide() # here is the point # tm is str list, just like '1, 2, 3, ..., n' chart.axes(Qt.Horizontal)[0].setCategories(candle_x_axis_label) # chartview = QChartView(chart) ui = QMainWindow() ui.setGeometry(50, 50, 500, 300) ui.setCentralWidget(chartview) ui.show() sys.exit(app.exec_())
and the plot
i check qtchart code, and find out the class type of candlestick x axis is QBarCategoryAxis but the class type of ma5 x axis is QValueAxis. so how to remove of the two x axis?
解决方案
You only have to obtain the QAbstractAxis corresponding to the X axis of the QLineSeries and hide it with setVisible(False), for this you must use QChart::axisX():
chart.axisX(ma5).setVisible(False)
Complete Code:
import sys from PyQt5.QtChart import QCandlestickSeries, QChart, QChartView, QCandlestickSet from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import Qt, QPointF from PyQt5 import QtChart as qc data = ((1, 7380, 7520, 7380, 7510, 7324), (2, 7520, 7580, 7410, 7440, 7372), (3, 7440, 7650, 7310, 7520, 7434), (4, 7450, 7640, 7450, 7550, 7480), (5, 7510, 7590, 7460, 7490, 7502), (6, 7500, 7590, 7480, 7560, 7512), (7, 7560, 7830, 7540, 7800, 7584)) app = QApplication(sys.argv) # series = QCandlestickSeries() series.setDecreasingColor(Qt.red) series.setIncreasingColor(Qt.green) ma5 = qc.QLineSeries() # 5-days average data line tm = [] # stores str type data # in a loop, series and ma5 append corresponding data for num, o, h, l, c, m in data: series.append(QCandlestickSet(o, h, l, c)) ma5.append(QPointF(num, m)) tm.append(str(num)) chart = QChart() chart.addSeries(series) # candle chart.addSeries(ma5) # ma5 line chart.setAnimationOptions(QChart.SeriesAnimations) chart.createDefaultAxes() chart.legend().hide() chart.axisX(series).setCategories(tm) chart.axisX(ma5).setVisible(False) chartview = QChartView(chart) ui = QMainWindow() ui.setGeometry(50, 50, 500, 300) ui.setCentralWidget(chartview) ui.show() sys.exit(app.exec_())