Как построить непоследовательную ось временного ряда с QtCharts? - PullRequest
3 голосов
/ 12 января 2020

Мне нужно построить диаграмму, ось X которой имеет тип данных date-time.

Я пытаюсь использовать QtCharts для этого, но я считаю, что QtCharts::QDateTimeAxis может обрабатывать только последовательные данные (ось X пропорциональна и последовательна).

Например, учитывая LineSeries:

{
   { "20:15:00", 123.0 },
   { "20:15:01", 124.0 },
   { "21:00:00", 125.0 },
   { "21:00:01", 126.0 },
}

Если я использую QDateTimeAxis в качестве оси X, я получу слишком большой диапазон пробелов по оси X, а не только 4 точки.

Несмотря на то, что между "20:15:02" и "20: 59 :: 59" нет данных, QChart по-прежнему дает пространство множества слотов по оси X, которые не имеют смысла.

Можем ли мы построить диаграмму с непоследовательной осью X с Qt?

Если Qt не может сделать это, есть ли библиотека C ++ с открытым исходным кодом, которая может сделать то же самое?

1 Ответ

2 голосов
/ 12 января 2020

Вам не нужно использовать QDateTimeAxis, поскольку эта ось спроектирована таким образом, что точки разнесены пропорционально разнице во времени. Поэтому одним из возможных решений является использование QCategoryAxis:

#include <QtWidgets>
#include <QtCharts>

QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    std::vector<std::pair<QString, float>> data = {
        { "20:15:00", 123.0 },
        { "20:15:01", 124.0 },
        { "21:00:00", 125.0 },
        { "21:00:01", 126.0 },
    };

    QScatterSeries *series = new QScatterSeries(); // or QLineSeries *series = new QLineSeries;
    QCategoryAxis *axisX = new QCategoryAxis;
    axisX->setMin(.5);
    axisX->setMax(data.size() + .5);
    axisX->setTitleText("Time");
    QValueAxis *axisY = new QValueAxis;
    axisY->setLabelFormat("%.2f");
    axisY->setTitleText("Example");
    axisY->setMin(122);
    axisY->setMax(127);

    for(std::size_t i=0; i < data.size(); i++){
        series->append(i + 1, data.at(i).second);
        axisX->append(data.at(i).first, i + 1.5);
    }

    QChart *chart = new QChart();
    chart->addSeries(series);

    chart->legend()->hide();
    chart->addAxis(axisX, Qt::AlignBottom);

    series->attachAxis(axisX);
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisY);

    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(820, 600);
    window.show();
    return a.exec();
}

enter image description here

...