How do I render bar charts by DateTime?
Solved
General and Desktop
-
How can I set the x-axis of a QBarSeries to QDateTimeAxis?
I want to render the candlestick chart and the bar chart into one chartbelow code is my sample code, I will convert from python to C++
from PyQt5.QtChart import ( QBarCategoryAxis, QBarSeries, QBarSet, QCandlestickSeries, QCandlestickSet, QChart, QChartView, QDateTimeAxis, QScatterSeries, QValueAxis, ) from PyQt5.QtCore import QDateTime from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget app = QApplication([]) class win(QMainWindow): widget: QWidget = QWidget() layout: QVBoxLayout = QVBoxLayout() chartView: QChartView = QChartView() chart: QChart = QChart() label: QLabel = QLabel() scatter: QScatterSeries def __init__(self): super().__init__() self.setMinimumSize(600, 400) min = 1704157200 * 1000 max = 1704160800 * 1000 cur = 1704157800 * 1000 minY = 49000 maxY = 56000 raw_data = [ (min, 45000), (max, 58000), ] series = QCandlestickSeries() data = QCandlestickSet() data.setTimestamp(cur) data.setOpen(55000) data.setHigh(53000) data.setLow(54000) data.setClose(52000) series.append(data) # chart object chart = QChart() # chart.legend().hide() trade = QCandlestickSeries() tradeSet = QCandlestickSet() price = 50000 tradeSet.setOpen(price) tradeSet.setClose(price) tradeSet.setHigh(price) tradeSet.setLow(price) tradeSet.setTimestamp(cur) trade.append(tradeSet) chart.addSeries(series) chart.addSeries(trade) test = QScatterSeries() test.append(cur, 49000) chart.addSeries(test) # bar chart bars = QBarSeries() curTime = QDateTime.fromMSecsSinceEpoch(cur) for i in range(7): sets = QBarSet(curTime.toString("h:mm")) sets.append(50750) bars.append(sets) chart.addSeries(bars) y = QValueAxis() x = QDateTimeAxis() z = QBarCategoryAxis() chart.setAxisX(x, series) chart.setAxisY(y, series) chart.setAxisX(x, trade) chart.setAxisY(y, trade) chart.setAxisX(x, test) chart.setAxisY(y, test) chart.setAxisX(z, bars) chart.setAxisY(y, bars) y.setMax(maxY) y.setMin(minY) y.setLabelFormat("%i") x.setMin(QDateTime.fromMSecsSinceEpoch(min)) x.setMax(QDateTime.fromMSecsSinceEpoch(max)) x.setFormat("h:mm") x.setTickCount(7) # displaying chart chart_view = QChartView(chart) chart_view.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chart_view) w = win() w.show() app.exec_()
-
How can I set the x-axis of a QBarSeries to QDateTimeAxis?
I want to render the candlestick chart and the bar chart into one chartbelow code is my sample code, I will convert from python to C++
from PyQt5.QtChart import ( QBarCategoryAxis, QBarSeries, QBarSet, QCandlestickSeries, QCandlestickSet, QChart, QChartView, QDateTimeAxis, QScatterSeries, QValueAxis, ) from PyQt5.QtCore import QDateTime from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget app = QApplication([]) class win(QMainWindow): widget: QWidget = QWidget() layout: QVBoxLayout = QVBoxLayout() chartView: QChartView = QChartView() chart: QChart = QChart() label: QLabel = QLabel() scatter: QScatterSeries def __init__(self): super().__init__() self.setMinimumSize(600, 400) min = 1704157200 * 1000 max = 1704160800 * 1000 cur = 1704157800 * 1000 minY = 49000 maxY = 56000 raw_data = [ (min, 45000), (max, 58000), ] series = QCandlestickSeries() data = QCandlestickSet() data.setTimestamp(cur) data.setOpen(55000) data.setHigh(53000) data.setLow(54000) data.setClose(52000) series.append(data) # chart object chart = QChart() # chart.legend().hide() trade = QCandlestickSeries() tradeSet = QCandlestickSet() price = 50000 tradeSet.setOpen(price) tradeSet.setClose(price) tradeSet.setHigh(price) tradeSet.setLow(price) tradeSet.setTimestamp(cur) trade.append(tradeSet) chart.addSeries(series) chart.addSeries(trade) test = QScatterSeries() test.append(cur, 49000) chart.addSeries(test) # bar chart bars = QBarSeries() curTime = QDateTime.fromMSecsSinceEpoch(cur) for i in range(7): sets = QBarSet(curTime.toString("h:mm")) sets.append(50750) bars.append(sets) chart.addSeries(bars) y = QValueAxis() x = QDateTimeAxis() z = QBarCategoryAxis() chart.setAxisX(x, series) chart.setAxisY(y, series) chart.setAxisX(x, trade) chart.setAxisY(y, trade) chart.setAxisX(x, test) chart.setAxisY(y, test) chart.setAxisX(z, bars) chart.setAxisY(y, bars) y.setMax(maxY) y.setMin(minY) y.setLabelFormat("%i") x.setMin(QDateTime.fromMSecsSinceEpoch(min)) x.setMax(QDateTime.fromMSecsSinceEpoch(max)) x.setFormat("h:mm") x.setTickCount(7) # displaying chart chart_view = QChartView(chart) chart_view.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chart_view) w = win() w.show() app.exec_()
@sun_caramel said in How do I render bar charts by DateTime?:
How can I set the x-axis of a QBarSeries to QDateTimeAxis?
The documentation says:
QDateTimeAxis can be used with any QXYSeries. To add a data point to the series, QDateTime::toMSecsSinceEpoch() is used
Since
QBarSeries
is not aQXYSeries
it wont work just like this -