-
Notifications
You must be signed in to change notification settings - Fork 11
/
plot.cpp
158 lines (130 loc) · 4.25 KB
/
plot.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <qprinter.h>
#include <qprintdialog.h>
#include <qwt_color_map.h>
#include <qwt_plot_spectrogram.h>
#include <qwt_scale_widget.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_renderer.h>
#include "plot.h"
class MyZoomer: public QwtPlotZoomer
{
public:
MyZoomer( QwtPlotCanvas *canvas ):
QwtPlotZoomer( canvas )
{
setTrackerMode( AlwaysOn );
}
virtual QwtText trackerTextF( const QPointF &pos ) const
{
QColor bg( Qt::white );
bg.setAlpha( 200 );
QwtText text = QwtPlotZoomer::trackerTextF( pos );
text.setBackgroundBrush( QBrush( bg ) );
return text;
}
};
class SpectrogramData: public QwtRasterData
{
public:
SpectrogramData()
{
setInterval( Qt::XAxis, QwtInterval( -1.5, 1.5 ) );
setInterval( Qt::YAxis, QwtInterval( -1.5, 1.5 ) );
setInterval( Qt::ZAxis, QwtInterval( 0.0, 10.0 ) );
}
virtual double value( double x, double y ) const
{
const double c = 0.842;
const double v1 = x * x + ( y - c ) * ( y + c );
const double v2 = x * ( y + c ) + x * ( y + c );
return 1.0 / ( v1 * v1 + v2 * v2 );
}
};
class ColorMap: public QwtLinearColorMap
{
public:
ColorMap():
QwtLinearColorMap( Qt::darkCyan, Qt::red )
{
addColorStop( 0.1, Qt::cyan );
addColorStop( 0.6, Qt::green );
addColorStop( 0.95, Qt::yellow );
}
};
Plot::Plot( QWidget *parent ):
QwtPlot( parent )
{
d_spectrogram = new QwtPlotSpectrogram();
d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count
d_spectrogram->setColorMap( new ColorMap() );
d_spectrogram->setData( new SpectrogramData() );
d_spectrogram->attach( this );
QList<double> contourLevels;
for ( double level = 0.5; level < 10.0; level += 1.0 )
contourLevels += level;
d_spectrogram->setContourLevels( contourLevels );
const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis );
// A color bar on the right axis
QwtScaleWidget *rightAxis = axisWidget( QwtPlot::yRight );
rightAxis->setTitle( "Intensity" );
rightAxis->setColorBarEnabled( true );
rightAxis->setColorMap( zInterval, new ColorMap() );
setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() );
enableAxis( QwtPlot::yRight );
plotLayout()->setAlignCanvasToScales( true );
replot();
// LeftButton for the zooming
// MidButton for the panning
// RightButton: zoom out by 1
// Ctrl+RighButton: zoom out to full size
QwtPlotZoomer* zoomer = new MyZoomer( canvas() );
zoomer->setMousePattern( QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier );
zoomer->setMousePattern( QwtEventPattern::MouseSelect3,
Qt::RightButton );
QwtPlotPanner *panner = new QwtPlotPanner( canvas() );
panner->setAxisEnabled( QwtPlot::yRight, false );
panner->setMouseButton( Qt::MidButton );
// Avoid jumping when labels with more/less digits
// appear/disappear when scrolling vertically
const QFontMetrics fm( axisWidget( QwtPlot::yLeft )->font() );
QwtScaleDraw *sd = axisScaleDraw( QwtPlot::yLeft );
sd->setMinimumExtent( fm.width( "100.00" ) );
const QColor c( Qt::darkBlue );
zoomer->setRubberBandPen( c );
zoomer->setTrackerPen( c );
}
void Plot::showContour( bool on )
{
d_spectrogram->setDisplayMode( QwtPlotSpectrogram::ContourMode, on );
replot();
}
void Plot::showSpectrogram( bool on )
{
d_spectrogram->setDisplayMode( QwtPlotSpectrogram::ImageMode, on );
d_spectrogram->setDefaultContourPen( on ? QPen() : QPen( Qt::NoPen ) );
replot();
}
#ifndef QT_NO_PRINTER
void Plot::printPlot()
{
#if 1
QPrinter printer;
#else
QPrinter printer( QPrinter::HighResolution );
#endif
printer.setOrientation( QPrinter::Landscape );
printer.setOutputFileName( "spectrogram.pdf" );
QPrintDialog dialog( &printer );
if ( dialog.exec() )
{
QwtPlotRenderer renderer;
renderer.setDiscardFlag( QwtPlotRenderer::DiscardBackground, false );
renderer.setLayoutFlag( QwtPlotRenderer::KeepFrames, true );
renderer.renderTo( this, printer );
}
}
#endif