如何在使用 QDateTimeAxis 时向 QChart 添加点 x-axis
How to add point to QChart when using QDateTimeAxis x-axis
我从
修改代码
我尝试将 datetime.timestamp()
用作 x-point,但它不起作用。
我的总小时是5小时,tickcount是10,我希望每半小时可以缩短时间,但事实并非如此。
如何在特定时间(可能是 8:45)向此 qchart 添加烛台?
import random, datetime
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCharts import QtCharts
from PySide2.QtCore import QPointF, Qt
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.plot = QtCharts.QChart()
self.chart_view = QtCharts.QChartView(self.plot)
self.setCentralWidget(self.chart_view)
self.series = QtCharts.QLineSeries()
self.candle_series = QtCharts.QCandlestickSeries()
self.series.setName("Magnitude")
self.plot.addSeries(self.series)
self.plot.addSeries(self.candle_series)
# self.plot.createDefaultAxes()
# self.plot.legend().hide()
self.candle_series.setDecreasingColor(Qt.green)
self.candle_series.setIncreasingColor(Qt.red)
# Setting X-axis
self.axis_x = QtCharts.QDateTimeAxis()
self.axis_x.setTickCount(11)
self.axis_x.setLabelsAngle(70)
self.axis_x.setFormat("h:mm")
self.axis_x.setTitleText("Date")
self.axis_x.setMax(datetime.datetime.strptime('202005071345','%Y%m%d%H%M'))
self.axis_x.setMin(datetime.datetime.strptime('202005070845','%Y%m%d%H%M'))
# Setting Y-axis
self.axis_y = QtCharts.QValueAxis()
self.axis_y.setTickCount(7)
self.axis_y.setLabelFormat("%i")
self.axis_y.setTitleText("Temperature [celcious]")
self.axis_y.setMax(60)
self.axis_y.setMin(10)
self.plot.setAxisX(self.axis_x, self.series)
self.plot.setAxisY(self.axis_y, self.series)
self.plot.setAxisX(self.axis_x,self.candle_series)
self.plot.setAxisY(self.axis_y,self.candle_series)
self.candle_series.append(QtCharts.QCandlestickSet(30,50,20,25))
self.series.append(float(QtCore.QDateTime.fromString("202005070849", "yyyyMMddhhmm").toMSecsSinceEpoch()),22,)
self.series.append(float(QtCore.QDateTime.fromString("202005070950", "yyyyMMddhhmm").toMSecsSinceEpoch()),20,)
self.series.append(float(QtCore.QDateTime.fromString("202005071051", "yyyyMMddhhmm").toMSecsSinceEpoch()),58,)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())
根据the docs:
datetime.timestamp()
Return POSIX timestamp corresponding to the
datetime instance. The return value is a float similar to that
returned by time.time().
Naive datetime instances are assumed to represent local time and this
method relies on the platform C mktime() function to perform the
conversion. Since datetime supports wider range of values than
mktime() on many platforms, this method may raise OverflowError for
times far in the past or far in the future.
For aware datetime instances, the return value is computed as:
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
正如您从它计算时差(以秒为单位)的方式中所见,但根据 the docs 需要以毫秒为单位的时间:
[...]
QDateTimeAxis can be used with any QXYSeries. To add a data point to
the series, QDateTime::toMSecsSinceEpoch()
is used:
[...]
考虑到上述情况,有 2 种可能的解决方案:
将timestamp()
乘以1000得到毫秒数:
self.series.append(
datetime.datetime.strptime("202005070849", "%Y%m%d%H%M").timestamp() * 1000,
22,
)
self.series.append(
datetime.datetime.strptime("202005070950", "%Y%m%d%H%M").timestamp() * 1000,
20,
)
self.series.append(
datetime.datetime.strptime("202005071051", "%Y%m%d%H%M").timestamp() * 1000,
58,
)
使用 QDateTime:
self.series.append(
QtCore.QDateTime.fromString(
"202005070849", "yyyyMMddhhmm"
).toMSecsSinceEpoch(),
22,
)
self.series.append(
QtCore.QDateTime.fromString(
"202005070950", "yyyyMMddhhmm"
).toMSecsSinceEpoch(),
20,
)
self.series.append(
QtCore.QDateTime.fromString(
"202005071051", "yyyyMMddhhmm"
).toMSecsSinceEpoch(),
58,
)
tickCount表示刻度总数,刻度间距满足以下条件:
dt = (dmax - dmin) / (tickCount -1)
它从 tickCount 中减去“1”,因为它也考虑了极值
self.axis_x.setTickCount(11)
我从
我尝试将
datetime.timestamp()
用作 x-point,但它不起作用。我的总小时是5小时,tickcount是10,我希望每半小时可以缩短时间,但事实并非如此。
如何在特定时间(可能是 8:45)向此 qchart 添加烛台?
import random, datetime
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCharts import QtCharts
from PySide2.QtCore import QPointF, Qt
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.plot = QtCharts.QChart()
self.chart_view = QtCharts.QChartView(self.plot)
self.setCentralWidget(self.chart_view)
self.series = QtCharts.QLineSeries()
self.candle_series = QtCharts.QCandlestickSeries()
self.series.setName("Magnitude")
self.plot.addSeries(self.series)
self.plot.addSeries(self.candle_series)
# self.plot.createDefaultAxes()
# self.plot.legend().hide()
self.candle_series.setDecreasingColor(Qt.green)
self.candle_series.setIncreasingColor(Qt.red)
# Setting X-axis
self.axis_x = QtCharts.QDateTimeAxis()
self.axis_x.setTickCount(11)
self.axis_x.setLabelsAngle(70)
self.axis_x.setFormat("h:mm")
self.axis_x.setTitleText("Date")
self.axis_x.setMax(datetime.datetime.strptime('202005071345','%Y%m%d%H%M'))
self.axis_x.setMin(datetime.datetime.strptime('202005070845','%Y%m%d%H%M'))
# Setting Y-axis
self.axis_y = QtCharts.QValueAxis()
self.axis_y.setTickCount(7)
self.axis_y.setLabelFormat("%i")
self.axis_y.setTitleText("Temperature [celcious]")
self.axis_y.setMax(60)
self.axis_y.setMin(10)
self.plot.setAxisX(self.axis_x, self.series)
self.plot.setAxisY(self.axis_y, self.series)
self.plot.setAxisX(self.axis_x,self.candle_series)
self.plot.setAxisY(self.axis_y,self.candle_series)
self.candle_series.append(QtCharts.QCandlestickSet(30,50,20,25))
self.series.append(float(QtCore.QDateTime.fromString("202005070849", "yyyyMMddhhmm").toMSecsSinceEpoch()),22,)
self.series.append(float(QtCore.QDateTime.fromString("202005070950", "yyyyMMddhhmm").toMSecsSinceEpoch()),20,)
self.series.append(float(QtCore.QDateTime.fromString("202005071051", "yyyyMMddhhmm").toMSecsSinceEpoch()),58,)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())
根据the docs:
datetime.timestamp()
Return POSIX timestamp corresponding to the datetime instance. The return value is a float similar to that returned by time.time().Naive datetime instances are assumed to represent local time and this method relies on the platform C mktime() function to perform the conversion. Since datetime supports wider range of values than mktime() on many platforms, this method may raise OverflowError for times far in the past or far in the future.
For aware datetime instances, the return value is computed as:
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
正如您从它计算时差(以秒为单位)的方式中所见,但根据 the docs 需要以毫秒为单位的时间:
[...]
QDateTimeAxis can be used with any QXYSeries. To add a data point to the series,QDateTime::toMSecsSinceEpoch()
is used:
[...]
考虑到上述情况,有 2 种可能的解决方案:
将
timestamp()
乘以1000得到毫秒数:self.series.append( datetime.datetime.strptime("202005070849", "%Y%m%d%H%M").timestamp() * 1000, 22, ) self.series.append( datetime.datetime.strptime("202005070950", "%Y%m%d%H%M").timestamp() * 1000, 20, ) self.series.append( datetime.datetime.strptime("202005071051", "%Y%m%d%H%M").timestamp() * 1000, 58, )
使用 QDateTime:
self.series.append( QtCore.QDateTime.fromString( "202005070849", "yyyyMMddhhmm" ).toMSecsSinceEpoch(), 22, ) self.series.append( QtCore.QDateTime.fromString( "202005070950", "yyyyMMddhhmm" ).toMSecsSinceEpoch(), 20, ) self.series.append( QtCore.QDateTime.fromString( "202005071051", "yyyyMMddhhmm" ).toMSecsSinceEpoch(), 58, )
tickCount表示刻度总数,刻度间距满足以下条件:
dt = (dmax - dmin) / (tickCount -1)
它从 tickCount 中减去“1”,因为它也考虑了极值
self.axis_x.setTickCount(11)