为了进行性能评估,我使用QCPScatterStyle::ssCircle
和QCPScatterStyle::ssDot
绘制了相同的数据,但都禁用了自适应采样。带有ssCircle
的图形看起来不错,有点笨拙,但这是可以预期的,而带有ssDot
的图形则更快,也可以预期,但是图形看起来太细了(不期望)并且数据会在调整大小时改变外观(并非预期)。
正确的图像经过最小的宽度变化。顶部使用ssDot
,底部使用ssCircle
。可以看出,前两个图之间存在明显的差异。
我做错什么了吗,这是一个错误,还是可能是预期的行为?
这是在Win10上使用QCustomPlot 2.0.1和MSVC 2017
#include <random>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <qcustomplot.h>
int
main( int argc, char *argv[] ) {
QApplication app( argc, argv );
QMainWindow wnd;
auto *customPlot = new QCustomPlot();
customPlot->addGraph();
std::normal_distribution<> d{5, 2};
std::random_device rd{};
std::mt19937 gen{rd()};
int const num = 100000;
QVector<double> x0, y0;
x0.resize( num );
y0.resize( num );
for( int n = 0; n < num; ++n ) {
x0[n] = d( gen );
y0[n] = d( gen );
};
customPlot->graph( 0 )->setScatterStyle(
QCPScatterStyle( QCPScatterStyle::ssCircle, 1 ) );
// QCPScatterStyle( QCPScatterStyle::ssDot, 1 ) );
customPlot->graph( 0 )->setLineStyle( QCPGraph::lsNone );
customPlot->graph( 0 )->setAdaptiveSampling( false );
customPlot->graph( 0 )->setData( x0, y0 );
customPlot->xAxis->setRange( -5, 15.0 );
customPlot->yAxis->setRange( -5, 15.0 );
wnd.setCentralWidget( customPlot );
wnd.resize( 400, 300 );
wnd.show();
return app.exec();
}
答案 0 :(得分:0)
我认为我已找到问题的原因。对我来说,它看起来像个虫子。从drawLine
切换到drawPoint
void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const
{
...
case ssDot:
{
//painter->drawLine(QPointF(x, y), QPointF(x+0.0001, y));
painter->drawPoint(QPointF(x, y));
break;
}
...
}