You can try something like this:

Qt Code:
  1. class MyTransform: public QwtTransform
  2. {
  3. public:
  4. MyTransform( double threshold ):
  5. m_threshold( threshold ),
  6. m_offset( threshold - log( threshold ) )
  7. {
  8. }
  9.  
  10. virtual double transform( double value ) const
  11. {
  12. double v = qAbs( value );
  13. if ( v > m_threshold )
  14. v = m_offset + log( v );
  15.  
  16. return value < 0.0 ? -v : v;
  17. }
  18.  
  19. virtual double invTransform( double value ) const
  20. {
  21. double v = qAbs( value );
  22. if ( v > m_offset )
  23. v = qExp( v ) - m_offset;
  24.  
  25. return value < 0.0 ? -v : v;
  26. }
  27.  
  28. virtual double bounded( double value ) const
  29. {
  30. return value;
  31. }
  32.  
  33. virtual QwtTransform *copy() const
  34. {
  35. return new MyTransform( m_threshold );
  36. }
  37.  
  38. private:
  39. const double m_threshold;
  40. const double m_offset;
  41. };
  42.  
  43. ...
  44. scaleEngine->setTransformation( new MyTransform( 10.0 ) );
  45. plot->setAxisScaleEngine( QwtPlot::yLeft, scaleEngine );
  46.  
  47. QwtScaleDiv scaleDiv( -10000.0, 10000.0 );
  48.  
  49. QList<double> majorTicks;
  50. majorTicks << -10000 << -1000 << -100 << -10 << -8 << -6 << -4 << -2 << 0 << 2 << 4 << 6 << 8 << 10 << 100 << 1000 << 10000;
  51. scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks );
  52.  
  53. plot->setAxisScaleDiv( QwtPlot::yLeft, scaleDiv );
To copy to clipboard, switch view to plain text mode 

If you can't set the ticks manually ( f.e. your application supports zooming ) you also have to implement your own type of QwtScaleEngine.

Uwe