绘图的 QWT 性能改进

Posted

技术标签:

【中文标题】绘图的 QWT 性能改进【英文标题】:QWT performance improvement for plot 【发布时间】:2014-12-31 07:06:01 【问题描述】:

我有一个二维数据集 X、Y 和一个强度值(但缺少一些点)。数据以每行的 X、Y 和 Z 形式存储在 sqlite 数据库中。每个情节我有大约 150 万行。 X 范围约为 4000 点宽,Y 范围约为 1800 点宽。所以图中只有大约 20% 的点实际上具有指定值,其余的被初始化为最小值。根据典型的颜色条比例范围(由用户指定),“可见”的更少。

我正在使用 QwtPlotSpectrogram (Qwt 6.1.2) 来获得我想要的输出。执行 SQL 查询需要一段时间。然后它需要相当长的时间来完成这个情节。我正在寻找有关如何提高性能的建议,尤其是在绘图方面。

我附上了一段代码摘录,显示我从数据库中提取数据然后绘制绘图。我做了一些修改,所以显示的代码更简洁,无需粘贴整个程序。希望有道理。

QSqlQuery query(tsd_data);
int pl=plot_number, y_count=1800;
query.exec("SELECT max(x), min(x), max(z), min(z) FROM database.plot_data WHERE pl="+QString::number(pl));
query.next();
int max_x = query.value(0).toInt();
int min_x = query.value(1).toInt();
int max_z = query.value(2).toInt();
int min_z = query.value(3).toInt();
int x_count = max_x-min_x;
QVector<double> dr_data(x_count*(y_count+1),-200);

query.exec("SELECT y, x, z FROM database.plot_data WHERE pl="+QString::number(pl));
while (query.next())

    int y = query.value(0).toInt();
    int x = query.value(1).toInt();
    dr_data[y*x_count+(x-min_x)] = query.value(2).toDouble();


QwtMatrixRasterData *qwtm = new QwtMatrixRasterData();
qwtm->setInterval( Qt::XAxis, QwtInterval( min_x-zero, max_x-zero ) );
qwtm->setInterval( Qt::YAxis, QwtInterval( 0, 1800) );
qwtm->setInterval( Qt::ZAxis, QwtInterval( min_z, max_z ) );
qwtm->setValueMatrix(dr_data,bin_count);
QwtPlotSpectrogram *spec = new QwtPlotSpectrogram();
spec->setRenderThreadCount( 0 ); // use system specific thread count
spec->setCachePolicy( QwtPlotRasterItem::PaintCache );
QwtLinearColorMap *colormap = new QwtLinearColorMap(Qt::black, Qt::white);
colormap->addColorStop(0.1,Qt::blue);
colormap->addColorStop(.3,Qt::cyan);
colormap->addColorStop(.5,Qt::green);
colormap->addColorStop(.7,Qt::yellow);
colormap->addColorStop(.9,Qt::red);
spec->setColorMap(colormap);
spec->setData(qwtm);
spec->setDisplayMode( QwtPlotSpectrogram::ImageMode, true );
ui->dr_plot->setEnabled(true);
ui->dr_scale->setEnabled(true);
ui->dr_scale->setColorBarEnabled(true);
ui->dr_scale->setColorBarWidth(40);
QwtInterval zInterval = spec->data()->interval(Qt::ZAxis);
ui->dr_scale->setColorMap(zInterval,colormap);
spec->attach(ui->dr_plot);
ui->dr_plot->replot();

【问题讨论】:

【参考方案1】:

从 SVN 主干获取 Qwt 版本并在 qwt_plot_spectrogram.cpp 中启用 DEBUG_RENDER。

在我的盒子 (i5 quadcore) 上运行频谱图示例时,我看到 1812x1078 像素的图像合成约为 25 毫秒。运行应用程序时,您在盒子上看到了什么数字?看到了什么数字?

【讨论】:

对不起,我应该补充说我使用的是 Qwt 6.1.2。我正在使用 i5-2520 2.5ghz,但通过 virtualbox。运行上述例程需要 10-15 秒,但我想我也需要将 sql 查询与 qwt 分开。看起来我在我的代码中做任何明显错误的事情吗?我从来没有使用过 Qwt,所以我几乎复制了这个例子

以上是关于绘图的 QWT 性能改进的主要内容,如果未能解决你的问题,请参考以下文章

Qwt 简单绘图示例

Qwt 追加点到绘图

Qwt 绘图自动缩放不起作用

Qwt - 重新绘制不清除当前绘图

qwt 保存绘图配置?

qwt 绘图曲线轴不可见