首页 文章

散点图不遵循散射风格ssDot的自适应采样

提问于
浏览
0

对于性能评估,我正在使用 QCPScatterStyle::ssCircleQCPScatterStyle::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();
}

1 回答

  • 0

    我想我找到了问题的原因 . 对我来说,它看起来像一个bug . 我通过从 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;
        }
        ...
    }
    

相关问题