CustomPlot源码修改之 X轴原点不显示坐标刻度的解决方法

问题描述:

横坐标原点在不同情况下不一定显示坐标值,现象如下图所示:

实际想达到的效果是在坐标原点处开始标记坐标

修改方法:

通过查看QCustomPlot的源码,QCPAxis::generateAutoTicks()函数中有如下代码:


  if (mScaleType == stLinear)
  {
    if (mAutoTickStep)
    {
      // Generate tick positions according to linear scaling:
      mTickStep = mRange.size()/(double)(mAutoTickCount+1e-10); // mAutoTickCount ticks on average, the small addition is to prevent jitter on exact integers
      double magnitudeFactor = qPow(10.0, qFloor(qLn(mTickStep)/qLn(10.0))); // get magnitude factor e.g. 0.01, 1, 10, 1000 etc.
      double tickStepMantissa = mTickStep/magnitudeFactor;
      if (tickStepMantissa < 5)
      {
        // round digit after decimal point to 0.5
        mTickStep = (int)(tickStepMantissa*2)/2.0*magnitudeFactor;
      } 
      else
      {
        // round to first digit in multiples of 2
        mTickStep = (int)(tickStepMantissa/2.0)*2.0*magnitudeFactor;
      }
    }
    if (mAutoSubTicks)
      mSubTickCount = calculateAutoSubTickCount(mTickStep);
    // Generate tick positions according to mTickStep:
    qint64 firstStep = floor(mRange.lower/mTickStep); // do not use qFloor here, or we'll lose 64 bit precision
    qint64 lastStep = ceil(mRange.upper/mTickStep); // do not use qCeil here, or we'll lose 64 bit precision
    int tickcount = lastStep-firstStep+1;
    if (tickcount < 0) tickcount = 0;
    mTickVector.resize(tickcount);
    for (int i=0; i<tickcount; ++i)
      //mTickVector[i] = (firstStep+i)*mTickStep;
      mTickVector[i] = mRange.lower + i*mTickStep;    //修改
  }

大致意思就是

1、在mAutoTickStep=true的情况下,自动计算横坐标的mTickStep(横坐标一大格表示的值),

      因为设置了ui->customPlot->xAxis->setAutoTickStep(false); ,所以不会走这个逻辑

2、在mAutoSubTicks=true的情况下,自动计算横坐标一大格里每一小格表示的值

3、接下来计算 firstStep,根据代码发现是 认为设置的range中的最小值除以一大格的刻度在取整,使用floor函数表示只取整数,小数部分不管是多少都舍弃,然后使用了firstStep*mTickStep去计算第一个显示的坐标,因为之前舍弃了小数部分,所以这个值实际是小于Range.lower的,所以造成了上述问题,将

mTickVector[i] = (firstStep+i)*mTickStep; 修改为 mTickVector[i] = mRange.lower + i*mTickStep;    //修改

可以解决此问题。

有兴趣可以在此函数基础上,向上捯一捯上面的函数调用,看看各种条件设置是什么样的。

猜你喜欢

转载自blog.csdn.net/qq_19875391/article/details/86636268