我修改了以下代码 此处
我试着用 datetime.timestamp()
作为X点,但它不工作。
我的完全小时数是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_())
根据 文献:
datetime.timestamp()
返回对应于datetime实例的POSIX时间戳。返回值是一个类似于time.time()返回的浮点数。Naive datetime实例被假定为代表本地时间,本方法依靠C平台的mktime()函数来执行转换。由于在许多平台上,datetime支持的值范围比mktime()更广,因此对于过去或未来很远的时间,本方法可能会引发OverflowError。
对于有意识的datetime实例,返回值计算为。
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
正如你所看到的,它计算时差的方式是以秒为单位的,但是根据... ... 文献 需要的时间,单位是毫秒。
[...] QDateTimeAxis可用于任何QXYSeries。要在系列中添加一个数据点,可以使用以下方法: [...] QDateTimeAxis可以用于任何QXYSeries。
QDateTime::toMSecsSinceEpoch()
已使用。 [...]
考虑到上述情况,有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表示总的tick数,tick的间距满足以下条件。
dt = (dmax - dmin) / (tickCount -1)
它从tickCount中减去 "1",因为它也考虑到了极端的因素
self.axis_x.setTickCount(11)