【问题标题】:QChart log axis data not shownQChart 日志轴数据未显示
【发布时间】:2018-09-19 13:39:20
【问题描述】:

我有一个 2Y 轴 plo,y1 上带有 QValueAxis,y2 上带有 QLogValueAxis

显示线性图,不显示对数图。两者的数据相同。

我想知道如何设置对数轴的刻度和限制?

这是代码:

chart = new QChart();
chart->legend()->hide();
chart->setTitle("Histogramm");

axisX = new QValueAxis;
axisX->setLabelFormat("%g");
chart->addAxis(axisX, Qt::AlignBottom);

series = new QLineSeries;
chart->addSeries(series);

axisY = new QValueAxis;
axisY->setTitleText("linear scale");
axisY->setLinePenColor(series->pen().color());

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

serieslog = new QLineSeries;
chart->addSeries(serieslog);


axisY3 = new QLogValueAxis();
axisY3->setTitleText("logarithmic scale");
axisY3->setBase(10.0);
axisY3->setLinePenColor(serieslog->pen().color());

chart->addAxis(axisY3, Qt::AlignRight);
serieslog->attachAxis(axisX);
serieslog->attachAxis(axisY3);

chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);

// Create a layout and add Chart
QGridLayout *layout = new QGridLayout(this);
layout->addWidget(chartView);

void WidgetHistogramm::setData(const std::vector<int> data)
{
    if (data.size() <= 0)
    {
        LOG_DEBUG() << "Histogram Data empty";
        return;
    }

    auto max = *max_element(std::begin(data), std::end(data));

    QVector<QPointF> points(data.size());

    for(std::vector<int>::size_type i = 0; i != data.size(); ++i) {
      points[i] = QPointF(i, data[i]*100/max);
    }

    series->replace(points);
    serieslog->replace(points);

    chart->axisX(series)->setRange(0, data.size());
    chart->axisY(series)->setRange(0, 100);
    chart->axisX(serieslog)->setRange(0, data.size());
    chart->axisY(serieslog)->setRange(-1000, 1);
}

【问题讨论】:

    标签: c++ qt qt5 qtcharts qchart


    【解决方案1】:

    范围不是指缩放值,而是实际值,例如,在您的情况下,它应该是从 epsilon 到 100。另一方面,以对数刻度显示的值必须是正数,在你的情况我看到有零所以一个可能的解决方案是添加一个 epsilon:

    void WidgetHistogramm::setData(const std::vector<int> data)
    {
        if (data.size() <= 0){
            LOG_DEBUG() << "Histogram Data empty";
            return;
        }
    
        auto max = *max_element(std::begin(data), std::end(data));
    
        QVector<QPointF> points(data.size());
    
        for(std::vector<int>::size_type i = 0; i != data.size(); ++i) {
            points[i] = QPointF(i, data[i]*100.0/max + std::numeric_limits<qreal>::epsilon());
        }
    
        series->replace(points);
        serieslog->replace(points);
    
        chart->axisX(series)->setRange(0, points.size());
        chart->axisY(series)->setRange(0, 100);
        chart->axisX(serieslog)->setRange(0, points.size());
        chart->axisY(serieslog)->setRange( std::numeric_limits<qreal>::epsilon(), 100);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      相关资源
      最近更新 更多