c++ - 如何用QtCharts绘制非连续的时间序列轴?

标签 c++ qt5 axis-labels timeserieschart qtcharts

我需要绘制一个图表,其 X 轴的数据类型为日期-时间

我尝试使用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轴上很多没有数据的槽位的空间。意义。

我们可以用Qt绘制一个X轴不连续的图表吗?

如果Qt无法做到这一点,是否有开源C++库可以做到这一点?

最佳答案

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

关于c++ - 如何用QtCharts绘制非连续的时间序列轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59706228/

相关文章:

c++ - 如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?

c++ - 主对话框关闭后关闭对话框

r - 如何在 R 中的 ggplot2 中使用 qpolot 在图例标题中上标 -(减号)

javascript - D3 如何从 0 以外的值开始我的 y 轴

qt - 我如何从 Qt 获取 Ubuntu 终端列表

python - 如何在 matplotlib 中为已绘制的线设置标签?

java - 构建opencv失败

c++ - 指向 void* 的类指针

c++ - 如何避免将数据缓冲区的额外拷贝复制到字符串?

c++ - Qt5.2 NetworkManager::networkInterfaces()