散点图不遵守散点样式ssDot的自适应采样

时间:2018-12-09 15:15:54

标签: c++ qt5 qcustomplot

为了进行性能评估,我使用QCPScatterStyle::ssCircleQCPScatterStyle::ssDot绘制了相同的数据,但都禁用了自适应采样。带有ssCircle的图形看起来不错,有点笨拙,但这是可以预期的,而带有ssDot的图形则更快,也可以预期,但是图形看起来太细了(不期望)并且数据会在调整大小时改变外观(并非预期)。

enter image description here

正确的图像经过最小的宽度变化。顶部使用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();
}

1 个答案:

答案 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;
    }
    ...
}