当使用QDateTimeAxaxis x轴时,如何在QChart中添加点。

问题描述 投票:1回答:1

我修改了以下代码 此处

  1. 我试着用 datetime.timestamp() 作为X点,但它不工作。

  2. 我的完全小时数是5小时,tickcount是10,我希望每半小时能缩短时间,但它不是。

  3. 如何添加烛台在特定时间(也许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_())

pyside2

python pyside2 qtcharts
1个回答
2
投票

根据 文献:

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)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.