如何将垂直直线正确地添加到图表的坐标轴上

我有一系列的散点m_scatterseries(蓝色散点),通过函数找到散点峰值并将它们添加到散点系列对象 peaksSeries(绿色散点)。我想用垂直于x轴的直线来在图表上展示峰值,但我的垂直直线似乎没有与坐标轴同步,有什么方法解决这一问题吗?
以下是我的部分代码:

    m_chart = new QChart(); // 创建一个 QChart 对象
    m_scatterseries = new QScatterSeries(m_chart); // 创建一个 QScatterSeries 对象,并将其添加到 QChart 对象中
    axisY = new QValueAxis; // 创建一个 QValueAxis 对象用作 Y 轴
    axisX = new QValueAxis; // 创建一个 QValueAxis 对象用作 X 轴
    m_chart->setAxisX(axisX, m_scatterseries); // 将 X 轴与散点系列关联
    m_chart->setAxisY(axisY, m_scatterseries);// 将Y轴与散点图系列关联
    chartView1 = new QChartView(m_chart);
    this->setCentralWidget(chartView1);// 设置图表视图为主窗口的中央部件,即将图标内容在主窗口中显示出来

    // 调用寻峰处理函数,设置阈值为30
    std::vector<int> peaks = findPeaks(m_scatterseries, 30);

    // 在图表上显示峰值
    QScatterSeries *peaksSeries = new QScatterSeries;  // 创建一个散点系列对象 peaksSeries
    for (int peak : peaks)  // 对于每个峰值点 peak
    {
        qreal y = m_scatterseries->at(peak).y();  // 获取对应峰值点的 Y 值
        peaksSeries->append(peak, y);  // 将峰值点的 X 和 Y 值添加到散点系列中
        qDebug()<<"YES:"<<peak;
    }
    m_chart->addSeries(peaksSeries);  // 将峰值散点系列添加到图表中

    // 遍历峰值点系列的数据点
    for (int i = 0; i < peaksSeries->count(); i++)
    {

        // 获取当前数据点的 x 坐标值
        qreal xValue = peaksSeries->at(i).x();
        qDebug()<<"xValue is:"<<xValue;

        // 创建一条垂直实线
        QGraphicsLineItem *verticalLine = new QGraphicsLineItem();
        verticalLine->setLine(xValue, m_chart->plotArea().top(), xValue, m_chart->plotArea().bottom());
        verticalLine->setPen(QPen(Qt::black));

        m_chart->scene()->addItem(verticalLine);  // 将垂直线添加到图表中
    }

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/905903723196195.png "#left")

img

【以下回答由 GPT 生成】

首先,您可以尝试使用QChart的setAxis*函数来将直线的坐标系设置为图表的坐标系,而不是把直线添加到图表场景中。

接下来,您可以使用QChart的addAxis函数将直线的坐标轴添加到图表中。这将确保直线与坐标轴同步。

以下是修改后的代码示例:

m_chart = new QChart(); // 创建一个 QChart 对象
m_scatterseries = new QScatterSeries(m_chart); // 创建一个 QScatterSeries 对象,并将其添加到 QChart 对象中
axisY = new QValueAxis; // 创建一个 QValueAxis 对象用作 Y 轴
axisX = new QValueAxis; // 创建一个 QValueAxis 对象用作 X 轴
m_chart->setAxisX(axisX); // 设置 X 轴
m_chart->setAxisY(axisY); // 设置 Y 轴
m_chart->addSeries(m_scatterseries); // 将散点系列添加到图表中
m_scatterseries->attachAxis(axisX); // 将 X 轴与散点系列关联
m_scatterseries->attachAxis(axisY); // 将 Y 轴与散点图系列关联
chartView1 = new QChartView(m_chart);
this->setCentralWidget(chartView1); // 设置图表视图为主窗口的中央部件,即将图标内容在主窗口中显示出来

// 调用寻峰处理函数,设置阈值为30
std::vector<int> peaks = findPeaks(m_scatterseries, 30);

// 在图表上显示峰值
QScatterSeries *peaksSeries = new QScatterSeries;  // 创建一个散点系列对象 peaksSeries
for (int peak : peaks)  // 对于每个峰值点 peak
{
    qreal y = m_scatterseries->at(peak).y();  // 获取对应峰值点的 Y 值
    peaksSeries->append(peak, y);  // 将峰值点的 X 和 Y 值添加到散点系列中
    qDebug() << "YES:" << peak;
}
m_chart->addSeries(peaksSeries);  // 将峰值散点系列添加到图表中

// 遍历峰值点系列的数据点
for (int i = 0; i < peaksSeries->count(); i++)
{
    // 获取当前数据点的 x 坐标值
    qreal xValue = peaksSeries->at(i).x();
    qDebug() << "xValue is:" << xValue;

    // 创建一条垂直实线
    QGraphicsLineItem *verticalLine = new QGraphicsLineItem();
    verticalLine->setLine(xValue, m_chart->plotArea().top(), xValue, m_chart->plotArea().bottom());
    m_chart->addAxis(verticalLine); // 将直线的坐标轴添加到图表中
}

通过这些修改,垂直直线应该能够正确地与坐标轴同步了。如果仍然存在问题,请提供更多上下文和代码,并描述问题的具体表现,我会进一步协助您解决该问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^