问题描述:
横坐标原点在不同情况下不一定显示坐标值,现象如下图所示:
实际想达到的效果是在坐标原点处开始标记坐标
修改方法:
通过查看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; //修改
可以解决此问题。
有兴趣可以在此函数基础上,向上捯一捯上面的函数调用,看看各种条件设置是什么样的。