Как добавить точку в QChart при использовании оси X QDateTimeAxis - PullRequest
1 голос
/ 07 мая 2020

Я изменяю код из здесь

  1. Я пытаюсь использовать datetime.timestamp() в качестве x-точки, но это не работает.

  2. Мой полный час составляет 5 часов, а счетчик тиков - 10, я ожидаю, что каждые полчаса время будет сокращаться, но это не так.

  3. как добавить подсвечник в указать c время (возможно, 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

1 Ответ

2 голосов
/ 07 мая 2020

Согласно docs :

datetime.timestamp ()

Возвращает отметку времени POSIX, соответствующую экземпляру datetime. Возвращаемое значение - это число с плавающей запятой, аналогичное возвращаемому функцией time.time ().

Предполагается, что наивные экземпляры datetime представляют местное время, и этот метод использует функцию платформы C mktime () для выполнения преобразования . Так как datetime поддерживает более широкий диапазон значений, чем mktime () на многих платформах, этот метод может вызывать OverflowError для случаев, когда в далеком прошлом или далеко в будущем.

Для известных экземпляров datetime возвращаемое значение вычисляется как:

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

Как вы можете видеть по способу вычисления разницы во времени в секундах, но согласно документам это время необходимо в миллисекундах:

[...]
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 указывает общее количество тактов, а интервал между тактами соответствует следующему условию:

dt = (dmax - dmin) / (tickCount -1)

Он вычитает «1» из tickCount, потому что он также учитывает крайние значения.

self.axis_x.setTickCount(11)

enter image description here

...