如何使用QtCharts绘制非连续时间序列轴?

3

我需要绘制一张图表,其中 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 轴上会有过多的空白范围,而不仅仅是四个点。
即使在 "20:15:02" 到 "20:59::59" 之间没有数据,QChart 仍然在 X 轴上给出了许多没有意义的间隔。
我们能否使用 Qt 绘制非连续的 X 轴图表?
如果 Qt 无法实现,是否有一个开源的 C++ 库可以做到同样的事情?

你可以展示一张你得到的图片和另一张你想要得到的图片。 - eyllanesc
我没有发现你指出的问题,例如使用QScatterSeries可以绘制您的数据:https://i.imgur.com/Ea1wIW9.png 或者使用QLineSeries:https://i.imgur.com/yas3f8c.png - eyllanesc
你可以回答我的请求。你想让数据之间的空间不与时间差成比例吗? - eyllanesc
谢谢,是的,我希望它“跳过”没有数据的空格。抱歉,我正在制作演示图片... - Leon
1个回答

3

您不必使用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


干得好!非常感谢! - Leon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接