在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换

Posted

技术标签:

【中文标题】在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换【英文标题】:Change axis ticks and label to switch between millimeter and inch in QWT Plot 【发布时间】:2013-09-03 08:33:44 【问题描述】:

我想要的是切换轴标签和刻度以匹配最佳显示英寸和毫米而不改变曲线点。我创建了一个自定义 QwtScaleDraw 并覆盖了 label() 方法,但这不会改变刻度。

class QwtMyScaleDraw : public QwtScaleDraw 
public:
    QwtMyScaleDraw() : QwtScaleDraw() 
    
protected:
    QwtText label(double value) const 
           // global conversion routine that creates a display string either as millimeter or inch
           return ConvertToString(value, ConversionFromMillimeter);
    
;

您可以在下图中看到此行为:

左边的比例是原始比例,中间的比例是我的自定义标签,右边是想要的比例。

在不使用手动转换值再次添加整条曲线的情况下获得所需结果的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在 qwt 库作者的帮助下,我找到了解决方案。答案是派生自QwtLinearScaleEngine 类并重载autoScaledivideScale 方法。

在我的实现中,可以选择任何转换因子(默认为 1 = 无转换)。这是我的代码:

class QwtUnitScaleDraw : public QwtScaleDraw 
public:
    QwtUnitScaleDraw(double ConversionFactor = 1.0) : QwtScaleDraw(), _ConversionFactor(ConversionFactor) 
    
protected:
    QwtText label(double value) const 
        return QwtScaleDraw::label(value * _ConversionFactor);
    
protected:
    double _ConversionFactor;
;

class QwtUnitScaleEngine: public QwtLinearScaleEngine 
public:
    QwtUnitScaleEngine(double ConversionFactor = 1.0) : QwtLinearScaleEngine(10), _ConversionFactor(ConversionFactor) 
    

    void autoScale(int maxSteps, double &x1, double &x2, double &stepSize) const 
        x1 *= _ConversionFactor;
        x2 *= _ConversionFactor;
        stepSize *= _ConversionFactor;
        QwtLinearScaleEngine::autoScale(maxSteps, x1, x2, stepSize);
        x1 /= _ConversionFactor;
        x2 /= _ConversionFactor;
        stepSize /= _ConversionFactor;

    

    QwtScaleDiv divideScale(double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0) const 
        x1 *= _ConversionFactor;
        x2 *= _ConversionFactor;
        stepSize *= _ConversionFactor;

        QwtScaleDiv Div = QwtLinearScaleEngine::divideScale(x1, x2, numMajorSteps, numMinorSteps, stepSize);

        QList<double> Ticks[QwtScaleDiv::NTickTypes];

        Ticks[QwtScaleDiv::MajorTick] = Div.ticks(QwtScaleDiv::MajorTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MajorTick].count(); i++) 
            Ticks[QwtScaleDiv::MajorTick][i] /= _ConversionFactor;
        
        Ticks[QwtScaleDiv::MediumTick] = Div.ticks(QwtScaleDiv::MediumTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MediumTick].count(); i++) 
            Ticks[QwtScaleDiv::MediumTick][i] /= _ConversionFactor;
        
        Ticks[QwtScaleDiv::MinorTick] = Div.ticks(QwtScaleDiv::MinorTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MinorTick].count(); i++) 
            Ticks[QwtScaleDiv::MinorTick][i] /= _ConversionFactor;
        

        return QwtScaleDiv(QwtInterval(x1 / _ConversionFactor, x2 / _ConversionFactor), Ticks);
    
protected:
    double _ConversionFactor;
;

【讨论】:

以上是关于在 QWT Plot 中更改轴刻度和标签以在毫米和英寸之间切换的主要内容,如果未能解决你的问题,请参考以下文章

qwt 绘图曲线轴不可见

Qwt:将日期/时间标签文本在底部轴上对齐

使用ggplot2更改R中的x轴刻度标签[重复]

如何更改 plot.zoo 图中的(数量)x 轴刻度? (轴()失败)

在 Qt 中使用 QWT 生成间隔不等的图形

Python PyX plot:更改轴刻度文本颜色