You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt图表中添加趋势线?如何在折线图上绘制趋势线?

在Qt折线图中添加趋势线的实现方法

核心思路

趋势线的本质是对现有数据进行拟合计算(最常用的是线性拟合),得到拟合方程后,生成对应的数据点,再将其作为独立的折线系列添加到图表中,与原折线区分显示。


步骤1:计算线性回归参数

首先需要基于现有数据点计算线性拟合的斜率(m)和截距(b),拟合方程为 y = m*x + b。以下是实现该计算的代码:

#include <QVector>
#include <QPointF>

void calculateLinearRegression(const QVector<QPointF>& data, double& m, double& b) {
    int n = data.size();
    if (n < 2) {
        m = 0;
        b = 0;
        return;
    }

    double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
    for (const QPointF& point : data) {
        sumX += point.x();
        sumY += point.y();
        sumXY += point.x() * point.y();
        sumX2 += point.x() * point.x();
    }

    double denominator = n * sumX2 - sumX * sumX;
    m = (n * sumXY - sumX * sumY) / denominator;
    b = (sumY * sumX2 - sumX * sumXY) / denominator;
}

步骤2:创建趋势线系列

利用计算出的m和b,基于原数据的X轴范围生成趋势线的端点(线性趋势线只需两个点即可),并创建对应的折线系列:

#include <QLineSeries>
#include <QChart>

QLineSeries* createTrendLine(const QVector<QPointF>& originalData, double m, double b) {
    QLineSeries* trendSeries = new QLineSeries();
    if (originalData.isEmpty()) return trendSeries;

    // 获取原数据的X轴最小和最大值
    double minX = originalData.first().x();
    double maxX = originalData.last().x();
    for (const QPointF& p : originalData) {
        if (p.x() < minX) minX = p.x();
        if (p.x() > maxX) maxX = p.x();
    }

    // 生成趋势线的两个端点
    trendSeries->append(minX, m * minX + b);
    trendSeries->append(maxX, m * maxX + b);

    // 设置趋势线样式(虚线、灰色,区分原折线)
    QPen pen(QColor(128, 128, 128));
    pen.setStyle(Qt::DashLine);
    trendSeries->setPen(pen);
    trendSeries->setName("趋势线");

    return trendSeries;
}

步骤3:添加趋势线到图表

将生成的趋势线系列添加到已有的QChart实例中即可:

// 假设已有原数据系列originalSeries和图表chart
QVector<QPointF> dataPoints;
// 填充dataPoints(从原系列中获取或直接传入)
for (const QPointF& p : originalSeries->points()) {
    dataPoints.append(p);
}

double m, b;
calculateLinearRegression(dataPoints, m, b);
QLineSeries* trendLine = createTrendLine(dataPoints, m, b);

chart->addSeries(trendLine);
// 确保趋势线使用与原折线相同的坐标轴
chart->createDefaultAxes();

额外说明

  • 如果需要非线性趋势线(如多项式拟合),只需修改拟合计算的逻辑,生成对应拟合方程的点即可。
  • 可以根据需求调整趋势线的样式(颜色、线宽、虚实),增强可视化区分度。

内容的提问来源于stack exchange,提问作者Neocoder_1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:35:26