PerfPlot::PerfPlot() : STScurve(NULL), LTScurve(NULL), SBcurve(NULL), DAYcurve(NULL) { xsd = new PPTimeScaleDraw(QDateTime()); xsd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, xsd); insertLegend(new QwtLegend(), QwtPlot::BottomLegend); setAxisTitle(yLeft, tr("Exponentially Weighted Average Stress")); setAxisTitle(xBottom, tr("Time (days)")); setAxisTitle(yRight, tr("Daily Stress")); enableAxis(yRight, true); static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); setAxisMaxMinor(yRight, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::yLeft, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::yRight, sd); grid = new QwtPlotGrid(); grid->attach(this); configUpdate(); }
void matrixofpixels::HistogramPlotProperty(double Xmin, double Xmax, double Ymax) { changeitems(); setAxisAutoScale(this->xTop); setAxisAutoScale(this->xBottom); //setAxisFont(QwtPlot::xBottom,QFont("Helvetica",15,1)); QwtText xlabel("Value"); QwtText ylabel("Events"); QColor col(Qt::red); xlabel.setColor(col); ylabel.setColor(col); xlabel.setFont(QFont("Helvetica",15,1)); ylabel.setFont(QFont("Helvetica",15,1)); setAxisTitle(QwtPlot::xBottom,xlabel); setAxisTitle(QwtPlot::yLeft,ylabel); setCanvasBackground(QColor(Qt::white)); setAxisScale(QwtPlot::xBottom, Xmin, Xmax); setAxisMaxMinor(QwtPlot::xBottom, 0); setAxisScale(QwtPlot::yLeft, 0, Ymax); setAxisMaxMinor(QwtPlot::yLeft, 0); plotLayout()->setAlignCanvasToScales(true); his->attach(this); /*QwtPlotGrid **/grid = new QwtPlotGrid; grid->setMajPen(QPen(Qt::gray, 0, Qt::DotLine)); grid->attach(this); replot(); }
PowerHist::PowerHist(MainWindow *mainWindow): rideItem(NULL), mainWindow(mainWindow), series(RideFile::watts), lny(false), shade(false), zoned(false), binw(3), withz(true), dt(1), minX(0), absolutetime(true), cache(NULL), source(Ride) { binw = appsettings->value(this, GC_HIST_BIN_WIDTH, 5).toInt(); if (appsettings->value(this, GC_SHADEZONES, true).toBool() == true) shade = true; else shade = false; // create a background object for shading bg = new PowerHistBackground(this); bg->attach(this); hrbg = new HrHistBackground(this); hrbg->attach(this); setCanvasBackground(Qt::white); canvas()->setFrameStyle(QFrame::NoFrame); setParameterAxisTitle(); setAxisTitle(yLeft, absolutetime ? tr("Time (minutes)") : tr("Time (percent)")); curve = new QwtPlotCurve(""); curve->setStyle(QwtPlotCurve::Steps); curve->setRenderHint(QwtPlotItem::RenderAntialiased); curve->attach(this); curveSelected = new QwtPlotCurve(""); curveSelected->setStyle(QwtPlotCurve::Steps); curveSelected->setRenderHint(QwtPlotItem::RenderAntialiased); curveSelected->attach(this); grid = new QwtPlotGrid(); grid->enableX(false); grid->attach(this); zoneLabels = QList<PowerHistZoneLabel *>(); hrzoneLabels = QList<HrHistZoneLabel *>(); zoomer = new penTooltip(this->canvas()); canvasPicker = new LTMCanvasPicker(this); connect(canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), this, SLOT(pointHover(QwtPlotCurve*, int))); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); configChanged(); }
SpinScanPolarPlot::SpinScanPolarPlot(QWidget *parent, uint8_t *spinData) : QwtPlot(parent), leftCurve(NULL), rightCurve(NULL), spinData(spinData) { // Setup the axis setAxisTitle(yLeft, "SpinScan"); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); QPalette pal; setAxisScale(yLeft, -90, 90); // max 8 bit plus a little setAxisScale(xBottom, -90, 90); // max 8 bit plus a little pal.setColor(QPalette::WindowText, GColor(CSPINSCANLEFT)); pal.setColor(QPalette::Text, GColor(CSPINSCANLEFT)); axisWidget(QwtPlot::yLeft)->setPalette(pal); axisWidget(QwtPlot::yLeft)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); enableAxis(xBottom, false); // very little value and some cpu overhead enableAxis(yLeft, false); rightCurve = new QwtPlotCurve("SpinScan Right"); rightCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive rightCurve->attach(this); rightCurve->setYAxis(QwtPlot::yLeft); rightSpinScanPolarData = new SpinScanPolarData(spinData, false); leftCurve = new QwtPlotCurve("SpinScan Left"); leftCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive leftCurve->attach(this); leftCurve->setYAxis(QwtPlot::yLeft); leftSpinScanPolarData = new SpinScanPolarData(spinData, true); static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); configChanged(CONFIG_APPEARANCE); // set colors }
ScatterPlot::ScatterPlot(Context *context) : context(context) { setAutoDelete(false); // no don't delete on detach ! curve = NULL; curve2 = NULL; hover = NULL; hover2 = NULL; grid = NULL; ride = NULL; static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(QwtPlot::yLeft, sd); connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); connect(context, SIGNAL(intervalHover(IntervalItem*)), this, SLOT(intervalHover(IntervalItem*))); // lets watch the mouse move... new mouseTracker(this); configChanged(CONFIG_APPEARANCE | CONFIG_GENERAL); // use latest wheelsize/cranklength and colors }
void BarChart::setOrientation( int o ) { const Qt::Orientation orientation = ( o == 0 ) ? Qt::Vertical : Qt::Horizontal; int axis1 = QwtPlot::xBottom; int axis2 = QwtPlot::yLeft; if ( orientation == Qt::Horizontal ) qSwap( axis1, axis2 ); d_barChartItem->setOrientation( orientation ); setAxisTitle( axis1, "Distros" ); setAxisMaxMinor( axis1, 3 ); setAxisScaleDraw( axis1, new DistroScaleDraw( orientation, d_distros ) ); setAxisTitle( axis2, "Hits per day ( HPD )" ); setAxisMaxMinor( axis2, 3 ); QwtScaleDraw *scaleDraw = new QwtScaleDraw(); scaleDraw->setTickLength( QwtScaleDiv::MediumTick, 4 ); setAxisScaleDraw( axis2, scaleDraw ); plotLayout()->setCanvasMargin( 0 ); replot(); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiuSummaryQwtPlot::setDefaults() { QPalette newPalette(palette()); newPalette.setColor(QPalette::Background, Qt::white); setPalette(newPalette); setAutoFillBackground(true); setCanvasBackground(Qt::white); QFrame* canvasFrame = dynamic_cast<QFrame*>(canvas()); if (canvasFrame) { canvasFrame->setFrameShape(QFrame::NoFrame); } canvas()->setMouseTracking(true); canvas()->installEventFilter(this); QPen gridPen(Qt::SolidLine); gridPen.setColor(Qt::lightGray); m_grid->setPen(gridPen); enableAxis(QwtPlot::xBottom, true); enableAxis(QwtPlot::yLeft, true); enableAxis(QwtPlot::xTop, false); enableAxis(QwtPlot::yRight, false); plotLayout()->setAlignCanvasToScales(true); useDateBasedTimeAxis(); QFont xAxisFont = axisFont(QwtPlot::xBottom); xAxisFont.setPixelSize(11); setAxisFont(QwtPlot::xBottom, xAxisFont); setAxisMaxMinor(QwtPlot::xBottom, 2); QFont yAxisFont = axisFont(QwtPlot::yLeft); yAxisFont.setPixelSize(11); setAxisFont(QwtPlot::yLeft, yAxisFont); setAxisMaxMinor(QwtPlot::yLeft, 3); QwtText axisTitleY = axisTitle(QwtPlot::yLeft); QFont yAxisTitleFont = axisTitleY.font(); yAxisTitleFont.setPixelSize(11); yAxisTitleFont.setBold(false); axisTitleY.setFont(yAxisTitleFont); axisTitleY.setRenderFlags(Qt::AlignRight); setAxisTitle(QwtPlot::yLeft, axisTitleY); QwtLegend* legend = new QwtLegend(this); // The legend will be deleted in the destructor of the plot or when // another legend is inserted. this->insertLegend(legend, BottomLegend); }
void matrixofpixels::PixPlotSpect(int TypeOfSpec,QwtMatrixRasterData *rasterpixdata) { changeitems(); MapPlot->setData(rasterpixdata); MapPlot->setRenderThreadCount(0); setAxisAutoScale(this->xTop); setAxisAutoScale(this->xBottom); switch (TypeOfSpec) { case 1: MapPlot->setColorMap(new ColorMap(BLUERED)); break; case 2: MapPlot->setColorMap(new ColorMap(BLACKWHITE)); break; default: MapPlot->setColorMap(new ColorMap(BLUERED)); } MapPlot->attach(/*MainPlot*/this); const QwtInterval zInterval = MapPlot->data()->interval(Qt::ZAxis); setAxisScale(QwtPlot::xBottom, 0, Npix); setAxisMaxMinor(QwtPlot::xBottom, 0); setAxisScale(QwtPlot::yLeft, 0, Npix); setAxisMaxMinor(QwtPlot::yLeft, 0); //rightAxis = new QwtScaleWidget(); QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); //rightAxis = axisWidget(QwtPlot::yRight); rightAxis->setColorBarEnabled(true); rightAxis->setColorBarWidth(20); rightAxis->setColorMap(zInterval, new ColorMap(TypeOfSpec) ); //ColorMap(TypeOfSpec); plotLayout()->setAlignCanvasToScales(true); setAxisScale(QwtPlot::yRight,zInterval.minValue(),zInterval.maxValue()); enableAxis(QwtPlot::yRight); replot(); setAutoFillBackground(true); /** setAutoFillBackground(true); - autozapolnenie, ctobi isklyuchit' nalozjeniya graphikov */ }
CpintPlot::CpintPlot(Context *context, QString p, const Zones *zones, bool rangemode) : path(p), thisCurve(NULL), CPCurve(NULL), allCurve(NULL), zones(zones), series(RideFile::watts), context(context), current(NULL), bests(NULL), isFiltered(false), shadeMode(2), rangemode(rangemode) { setAutoFillBackground(true); setAxisTitle(xBottom, tr("Interval Length")); LogTimeScaleDraw *ld = new LogTimeScaleDraw; ld->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(xBottom, ld); setAxisScaleEngine(xBottom, new QwtLogScaleEngine); QwtScaleDiv div( (double)0.017, (double)60 ); div.setTicks(QwtScaleDiv::MajorTick, LogTimeScaleDraw::ticks); setAxisScaleDiv(QwtPlot::xBottom, div); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(yLeft, sd); setAxisTitle(yLeft, tr("Average Power (watts)")); setAxisMaxMinor(yLeft, 0); plotLayout()->setAlignCanvasToScales(true); //grid = new QwtPlotGrid(); //grid->enableX(true); //grid->attach(this); curveTitle.attach(this); curveTitle.setXValue(5); curveTitle.setYValue(60); curveTitle.setLabel(QwtText("", QwtText::PlainText)); // default to no title zoomer = new penTooltip(static_cast<QwtPlotCanvas*>(this->canvas())); zoomer->setMousePattern(QwtEventPattern::MouseSelect1, Qt::LeftButton, Qt::ShiftModifier); canvasPicker = new LTMCanvasPicker(this); static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); connect(canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), this, SLOT(pointHover(QwtPlotCurve*, int))); configChanged(); // apply colors ecp = new ExtendedCriticalPower(context); extendedCPCurve4 = NULL; extendedCurveTitle2 = NULL; }
Plot::Plot( QWidget *parent ): QwtPlot( parent ) { QwtPlotCanvas *canvas = new QwtPlotCanvas(); canvas->setBorderRadius( 10 ); setCanvas( canvas ); #if 0 QwtPlotGrid *grid = new QwtPlotGrid(); grid->setPen( Qt::DotLine ); grid->attach( this ); #endif d_spectrogram = new QwtPlotSpectrogram(); d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count d_spectrogram->setColorMap( new ColorMap() ); d_spectrogram->setData( new RasterData() ); d_spectrogram->attach( this ); const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis ); // A color bar on the right axis QwtScaleWidget *rightAxis = axisWidget( QwtPlot::yRight ); rightAxis->setColorBarEnabled( true ); rightAxis->setColorBarWidth( 40 ); rightAxis->setColorMap( zInterval, new ColorMap() ); setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() ); enableAxis( QwtPlot::yRight ); plotLayout()->setAlignCanvasToScales( true ); setAxisScale( QwtPlot::xBottom, 0.0, 3.0 ); setAxisMaxMinor( QwtPlot::xBottom, 0 ); setAxisScale( QwtPlot::yLeft, 0.0, 3.0 ); setAxisMaxMinor( QwtPlot::yLeft, 0 ); QwtPlotMagnifier *magnifier = new QwtPlotMagnifier( canvas ); magnifier->setAxisEnabled( QwtPlot::yRight, false ); QwtPlotPanner *panner = new QwtPlotPanner( canvas ); panner->setAxisEnabled( QwtPlot::yRight, false ); }
PlotZoz::PlotZoz(QWidget *) { // Прозрачность полотна QwtPlotCanvas *canvas = new QwtPlotCanvas(); canvas->setFrameStyle(QFrame::NoFrame); canvas->setPaintAttribute(QwtPlotCanvas::BackingStore, false); canvas->setPaintAttribute(QwtPlotCanvas::Opaque, false); canvas->setAttribute(Qt::WA_OpaquePaintEvent, false); canvas->setAutoFillBackground( false ); setCanvas(canvas); plotLayout()->setAlignCanvasToScales(true); // Отключаем щкалы деления for (int i=0; i<QwtPlot::axisCnt; i++) { axisScaleDraw(i)->enableComponent(QwtScaleDraw::Ticks, false); axisScaleDraw(i)->enableComponent(QwtScaleDraw::Backbone, false); } pltSpectrogram = new PlotSpectr(); pltRasterData = new PlotRasterData(); pltGrid = new QwtPlotGrid; pltGrid->enableXMin(true); // разрешаем отображение линий сетки, соответствующих вспомогательным делениям нижней шкалы pltGrid->enableYMin(true); // разрешаем отображение линий сетки, соответствующих вспомогательным делениям нижней шкалы pltGrid->setMajorPen(QPen(Qt::gray,0,Qt::DotLine)); // черный для основных делений pltGrid->setMinorPen(QPen(Qt::gray,0,Qt::DotLine)); // серый для вспомогательных pltGrid->attach(this); setAxisMaxMajor(0,20); setAxisMaxMinor(0,0); setAxisMaxMajor(1,20); setAxisMaxMinor(1,0); setAxisMaxMajor(2,20); setAxisMaxMinor(2,0); setAxisMaxMajor(3,20); setAxisMaxMinor(3,0); canvas->setCursor(Qt::ArrowCursor); setMouseTracking(true); for (int i=0; i<QwtPlot::axisCnt; i++) axisWidget(i)->setMouseTracking(true); }
ScatterPlot::ScatterPlot(Context *context) : context(context) { setInstanceName("2D Plot"); all = NULL; grid = NULL; canvas()->setFrameStyle(QFrame::NoFrame); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::yLeft, sd); connect(context, SIGNAL(configChanged()), this, SLOT(configChanged())); configChanged(); // use latest colors etc }
void Plot::applyAxisSettings( int axis, const Settings &settings ) { QwtDateScaleEngine *scaleEngine = static_cast<QwtDateScaleEngine *>( axisScaleEngine( axis ) ); scaleEngine->setMaxWeeks( settings.maxWeeks ); setAxisMaxMinor( axis, settings.maxMinorSteps ); setAxisMaxMajor( axis, settings.maxMajorSteps ); setAxisScale( axis, QwtDate::toDouble( settings.startDateTime ), QwtDate::toDouble( settings.endDateTime ) ); }
ScatterPlot::ScatterPlot(Context *context) : context(context) { all = NULL; grid = NULL; static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(QwtPlot::yLeft, sd); connect(context, SIGNAL(configChanged()), this, SLOT(configChanged())); configChanged(); // use latest colors etc }
CpintPlot::CpintPlot(Context *context, QString p, const Zones *zones) : path(p), thisCurve(NULL), CPCurve(NULL), allCurve(NULL), zones(zones), series(RideFile::watts), context(context), current(NULL), bests(NULL), isFiltered(false), shadeMode(2) { setInstanceName("CP Plot"); assert(!USE_T0_IN_CP_MODEL); // doesn't work with energyMode=true setAxisTitle(xBottom, tr("Interval Length")); LogTimeScaleDraw *ld = new LogTimeScaleDraw; ld->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(xBottom, ld); setAxisScaleEngine(xBottom, new LogTimeScaleEngine); setAxisScale(xBottom, (double)0.017, (double)60); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(yLeft, sd); setAxisTitle(yLeft, tr("Average Power (watts)")); setAxisMaxMinor(yLeft, 0); plotLayout()->setAlignCanvasToScales(true); grid = new QwtPlotGrid(); grid->enableX(true); grid->attach(this); curveTitle.attach(this); curveTitle.setXValue(5); curveTitle.setYValue(20); curveTitle.setLabel(QwtText("", QwtText::PlainText)); // default to no title zoomer = new penTooltip(this->canvas()); zoomer->setMousePattern(QwtEventPattern::MouseSelect1, Qt::LeftButton, Qt::ShiftModifier); canvasPicker = new LTMCanvasPicker(this); canvas()->setFrameStyle(QFrame::NoFrame); connect(canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), this, SLOT(pointHover(QwtPlotCurve*, int))); configChanged(); // apply colors }
void Plot::initCanvas() { setGeometry(100,100,800,600); setTitle(tr("Title")); setCanvasBackground(QBrush(QColor("white"))); setCanvasLineWidth(1); // 画布边缘宽度 // enableAxis(0,false); /* * axisId: * y_leff: 0 * y_right: 1 * x_buttom: 2 * x_top: 4 */ setAxisTitle(2, tr("wave number")); setAxisTitle(0, tr("DOP")); setAxisMaxMajor(0, 10); // 主刻度的个数 setAxisMaxMinor(0, 10); // 辅助刻度的分裂数目 insertLegend(new QwtLegend(),QwtPlot::RightLegend); }
Plot::Plot( QWidget *parent ): QwtPlot( parent ) { setAutoReplot( false ); setTitle( "Frequency Response of a Second-Order System" ); QwtPlotCanvas *canvas = new QwtPlotCanvas(); canvas->setBorderRadius( 10 ); setCanvas( canvas ); setCanvasBackground( QColor( "MidnightBlue" ) ); // legend QwtLegend *legend = new QwtLegend; insertLegend( legend, QwtPlot::BottomLegend ); // grid QwtPlotGrid *grid = new QwtPlotGrid; grid->enableXMin( true ); grid->setMajorPen( Qt::white, 0, Qt::DotLine ); grid->setMinorPen( Qt::gray, 0 , Qt::DotLine ); grid->attach( this ); // axes enableAxis( QwtPlot::yRight ); setAxisTitle( QwtPlot::xBottom, "Normalized Frequency" ); setAxisTitle( QwtPlot::yLeft, "Amplitude [dB]" ); setAxisTitle( QwtPlot::yRight, "Phase [deg]" ); setAxisMaxMajor( QwtPlot::xBottom, 6 ); setAxisMaxMinor( QwtPlot::xBottom, 9 ); setAxisScaleEngine( QwtPlot::xBottom, new QwtLogScaleEngine ); // curves d_curve1 = new QwtPlotCurve( "Amplitude" ); d_curve1->setRenderHint( QwtPlotItem::RenderAntialiased ); d_curve1->setPen( Qt::yellow ); d_curve1->setLegendAttribute( QwtPlotCurve::LegendShowLine ); d_curve1->setYAxis( QwtPlot::yLeft ); d_curve1->attach( this ); d_curve2 = new QwtPlotCurve( "Phase" ); d_curve2->setRenderHint( QwtPlotItem::RenderAntialiased ); d_curve2->setPen( Qt::cyan ); d_curve2->setLegendAttribute( QwtPlotCurve::LegendShowLine ); d_curve2->setYAxis( QwtPlot::yRight ); d_curve2->attach( this ); // marker d_marker1 = new QwtPlotMarker(); d_marker1->setValue( 0.0, 0.0 ); d_marker1->setLineStyle( QwtPlotMarker::VLine ); d_marker1->setLabelAlignment( Qt::AlignRight | Qt::AlignBottom ); d_marker1->setLinePen( Qt::green, 0, Qt::DashDotLine ); d_marker1->attach( this ); d_marker2 = new QwtPlotMarker(); d_marker2->setLineStyle( QwtPlotMarker::HLine ); d_marker2->setLabelAlignment( Qt::AlignRight | Qt::AlignBottom ); d_marker2->setLinePen( QColor( 200, 150, 0 ), 0, Qt::DashDotLine ); d_marker2->setSymbol( new QwtSymbol( QwtSymbol::Diamond, QColor( Qt::yellow ), QColor( Qt::green ), QSize( 8, 8 ) ) ); d_marker2->attach( this ); setDamp( 0.0 ); setAutoReplot( true ); }
MUPlot::MUPlot(MUWidget *muw, CriticalPowerWindow *parent, Context *context) : QwtPlot(parent), QwtSyntheticPointData(MUN), context(context), muw(muw), parent(parent), modelCurve(NULL), slowCurve(NULL), fastCurve(NULL), mmpCurve(NULL) { // initalise all the model stufff // probably abstract this out later muSet = NULL; slowHandle = NULL; slowLine = NULL; slowDrag = false; fastHandle = NULL; fastLine = NULL; fastDrag = false; setAutoDelete(false); setAutoFillBackground(true); static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); // left yAxis scale prettify QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(yLeft, sd); setAxisTitle(yLeft, tr("w(x)")); setAxisMaxMinor(yLeft, 0); plotLayout()->setAlignCanvasToScales(true); // 0.5 increments on bottom axis QwtValueList ytick[QwtScaleDiv::NTickTypes]; for (double i=0.0f; i<=10.0f; i+= 1.0) ytick[QwtScaleDiv::MajorTick]<<i; setAxisScaleDiv(yLeft,QwtScaleDiv(0.0f,10.0f,ytick)); // bottom xAxis scale prettify sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(xBottom, sd); setAxisTitle(xBottom, tr("Motor Unit, x")); setAxisMaxMinor(xBottom, 0); // 0.2 increments on bottom axis QwtValueList xtick[QwtScaleDiv::NTickTypes]; for (double i=0.0f; i<=1.0f; i+= 0.2) xtick[QwtScaleDiv::MajorTick]<<i; setAxisScaleDiv(xBottom,QwtScaleDiv(0.0f,1.0f,xtick)); // now color everything we created configChanged(CONFIG_APPEARANCE); // set to a 2 Normal Model setModel(2); // set mouse tracker parent->setMouseTracking(true); installEventFilter(parent); new muMouseTracker(this); }
PfPvPlot::PfPvPlot(Context *context) : rideItem (NULL), context(context), hover(NULL), cp_ (0), cad_ (85), cl_ (0.175), shade_zones(true) { static_cast<QwtPlotCanvas*>(canvas())->setFrameStyle(QFrame::NoFrame); setAutoFillBackground(true); setAxisTitle(yLeft, tr("Average Effective Pedal Force (N)")); setAxisScale(yLeft, 0, 600); setAxisTitle(xBottom, tr("Circumferential Pedal Velocity (m/s)")); setAxisScale(xBottom, 0, 3); setAxisMaxMinor(yLeft, 0); setAxisMaxMinor(xBottom, 0); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(xBottom, sd); sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); sd->enableComponent(QwtScaleDraw::Ticks, false); sd->enableComponent(QwtScaleDraw::Backbone, false); setAxisScaleDraw(yLeft, sd); mX = new QwtPlotMarker(); mX->setLineStyle(QwtPlotMarker::VLine); mX->attach(this); mY = new QwtPlotMarker(); mY->setLineStyle(QwtPlotMarker::HLine); mY->attach(this); cpCurve = new QwtPlotCurve(); cpCurve->setRenderHint(QwtPlotItem::RenderAntialiased); cpCurve->attach(this); curve = new QwtPlotCurve(); curve->attach(this); cl_ = appsettings->value(this, GC_CRANKLENGTH).toDouble() / 1000.0; // markup timeInQuadrant tiqMarker[0] = new QwtPlotMarker(); tiqMarker[0]->attach(this); tiqMarker[0]->setXValue(2.9); tiqMarker[0]->setYValue(580); tiqMarker[1] = new QwtPlotMarker(); tiqMarker[1]->attach(this); tiqMarker[1]->setXValue(0.1); tiqMarker[1]->setYValue(580); tiqMarker[2] = new QwtPlotMarker(); tiqMarker[2]->attach(this); tiqMarker[2]->setXValue(0.1); tiqMarker[2]->setYValue(10); tiqMarker[3] = new QwtPlotMarker(); tiqMarker[3]->attach(this); tiqMarker[3]->setXValue(2.9); tiqMarker[3]->setYValue(10); merge_intervals = false; frame_intervals = true; // only default on first time through, after this the user may have adjusted if (appsettings->value(this, GC_SHADEZONES, true).toBool()==false) shade_zones = false; else shade_zones = true; configChanged(); recalc(); }
void PowerHist::recalc() { QVector<unsigned int> *array; QVector<unsigned int> *selectedArray; int arrayLength = 0; double delta; // make sure the interval length is set if (dt <= 0) return; if (selected == watts) { array = &wattsArray; delta = wattsDelta; arrayLength = wattsArray.size(); selectedArray = &wattsSelectedArray; } else if (selected == wattsZone) { array = &wattsZoneArray; delta = 1; arrayLength = wattsZoneArray.size(); selectedArray = &wattsZoneSelectedArray; } else if (selected == nm) { array = &nmArray; delta = nmDelta; arrayLength = nmArray.size(); selectedArray = &nmSelectedArray; } else if (selected == hr) { array = &hrArray; delta = hrDelta; arrayLength = hrArray.size(); selectedArray = &hrSelectedArray; } else if (selected == hrZone) { array = &hrZoneArray; delta = 1; arrayLength = hrZoneArray.size(); selectedArray = &hrZoneSelectedArray; } else if (selected == kph) { array = &kphArray; delta = kphDelta; arrayLength = kphArray.size(); selectedArray = &kphSelectedArray; } else if (selected == cad) { array = &cadArray; delta = cadDelta; arrayLength = cadArray.size(); selectedArray = &cadSelectedArray; } if (!array) return; // binning of data when not zoned if (selected != wattsZone && selected != hrZone) { // we add a bin on the end since the last "incomplete" bin // will be dropped otherwise int count = int(ceil((arrayLength - 1) / binw))+1; // allocate space for data, plus beginning and ending point QVector<double> parameterValue(count+2, 0.0); QVector<double> totalTime(count+2, 0.0); QVector<double> totalTimeSelected(count+2, 0.0); int i; for (i = 1; i <= count; ++i) { int high = i * binw; int low = high - binw; if (low==0 && !withz) low++; parameterValue[i] = high * delta; totalTime[i] = 1e-9; // nonzero to accomodate log plot totalTimeSelected[i] = 1e-9; // nonzero to accomodate log plot while (low < high && low<arrayLength) { if (selectedArray && (*selectedArray).size()>low) totalTimeSelected[i] += dt * (*selectedArray)[low]; totalTime[i] += dt * (*array)[low++]; } } totalTime[i] = 1e-9; // nonzero to accomodate log plot parameterValue[i] = i * delta * binw; totalTime[0] = 1e-9; parameterValue[0] = 0; // convert vectors from absolute time to percentage // if the user has selected that if (!absolutetime) { percentify(totalTime, 1); percentify(totalTimeSelected, 1); } curve->setData(parameterValue.data(), totalTime.data(), count + 2); curveSelected->setData(parameterValue.data(), totalTimeSelected.data(), count + 2); // make see through if we're shading zones QBrush brush = curve->brush(); QColor bcol = brush.color(); bool zoning = (selected == watts && shadeZones()) || (selected == hr && shadeHRZones()); bcol.setAlpha(zoning ? 165 : 200); brush.setColor(bcol); curve->setBrush(brush); setAxisScaleDraw(QwtPlot::xBottom, new QwtScaleDraw); // HR typically starts at 80 or so, rather than zero // lets crop the chart so we can focus on the data // if we're working with HR data... if (selected == hr) { double MinX=0; for (int i=0; i<hrArray.size(); i++) { if (hrArray[i] > 0) { MinX = i; break; } } setAxisScale(xBottom, MinX, parameterValue[count + 1]); } else { setAxisScale(xBottom, 0.0, parameterValue[count + 1]); } // we only do zone labels when using absolute values refreshZoneLabels(); refreshHRZoneLabels(); } else { // we're not binning instead we are prettyfing the columnar // display in much the same way as the weekly summary workds // Each zone column will have 4 points QVector<double> xaxis (array->size() * 4); QVector<double> yaxis (array->size() * 4); QVector<double> selectedxaxis (selectedArray->size() * 4); QVector<double> selectedyaxis (selectedArray->size() * 4); // samples to time for (int i=0, offset=0; i<array->size(); i++) { double x = (double) i - 0.5; double y = dt * (double)(*array)[i]; xaxis[offset] = x +0.05; yaxis[offset] = 0; offset++; xaxis[offset] = x+0.05; yaxis[offset] = y; offset++; xaxis[offset] = x+0.95; yaxis[offset] = y; offset++; xaxis[offset] = x +0.95; yaxis[offset] = 0; offset++; } for (int i=0, offset=0; i<selectedArray->size(); i++) { double x = (double)i - 0.5; double y = dt * (double)(*selectedArray)[i]; selectedxaxis[offset] = x +0.05; selectedyaxis[offset] = 0; offset++; selectedxaxis[offset] = x+0.05; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x+0.95; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x +0.95; selectedyaxis[offset] = 0; offset++; } if (!absolutetime) { percentify(yaxis, 2); percentify(selectedyaxis, 2); } // set those curves curve->setData(xaxis.data(), yaxis.data(), xaxis.size()); // Opaque - we don't need to show zone shading QBrush brush = curve->brush(); QColor bcol = brush.color(); bcol.setAlpha(200); brush.setColor(bcol); curve->setBrush(brush); curveSelected->setData(selectedxaxis.data(), selectedyaxis.data(), selectedxaxis.size()); // zone scale draw if (selected == wattsZone && rideItem && rideItem->zones) { setAxisScaleDraw(QwtPlot::xBottom, new ZoneScaleDraw(rideItem->zones, rideItem->zoneRange())); setAxisScale(QwtPlot::xBottom, -0.99, rideItem->zones->numZones(rideItem->zoneRange()), 1); } // hr scale draw int hrRange; if (selected == hrZone && rideItem && mainWindow->hrZones() && (hrRange=mainWindow->hrZones()->whichRange(rideItem->dateTime.date())) != -1) { setAxisScaleDraw(QwtPlot::xBottom, new HrZoneScaleDraw(mainWindow->hrZones(), hrRange)); setAxisScale(QwtPlot::xBottom, -0.99, mainWindow->hrZones()->numZones(hrRange), 1); } setAxisMaxMinor(QwtPlot::xBottom, 0); } setYMax(); replot(); }
//--------------------------------------------------------------------------- Plot::Plot( size_t streamPos, size_t Type, size_t Group, QWidget *parent ) : QwtPlot( parent ), m_streamPos( streamPos ), m_type( Type ), m_group( Group ) { setAutoReplot( false ); QwtPlotCanvas* canvas = dynamic_cast<QwtPlotCanvas*>( this->canvas() ); if ( canvas ) { canvas->setFrameStyle( QFrame::Plain | QFrame::Panel ); canvas->setLineWidth( 1 ); #if 1 canvas->setPalette( QColor("Cornsilk") ); #endif } setAxisMaxMajor( QwtPlot::yLeft, 0 ); setAxisMaxMinor( QwtPlot::yLeft, 0 ); setAxisScaleDraw( QwtPlot::yLeft, new PlotScaleDrawY() ); enableAxis( QwtPlot::xBottom, false ); // something invalid setAxisScale( QwtPlot::xBottom, -1, 0 ); setAxisScale( QwtPlot::yLeft, -1, 0 ); // Plot grid QwtPlotGrid *grid = new QwtPlotGrid(); grid->enableXMin( true ); grid->enableYMin( true ); grid->setMajorPen( Qt::darkGray, 0, Qt::DotLine ); grid->setMinorPen( Qt::gray, 0 , Qt::DotLine ); grid->attach( this ); m_cursor = new PlotCursor( canvas ); m_cursor->setPosition( 0 ); // curves for( unsigned j = 0; j < PerStreamType[m_type].PerGroup[m_group].Count; ++j ) { QwtPlotCurve* curve = new QwtPlotCurve( PerStreamType[m_type].PerItem[PerStreamType[m_type].PerGroup[m_group].Start + j].Name ); curve->setPen( curveColor( j ) ); curve->setRenderHint( QwtPlotItem::RenderAntialiased ); curve->setZ( curve->z() - j ); //Invert data order (e.g. MAX before MIN) curve->attach( this ); m_curves += curve; } // visual helpers if ( m_type == Type_Video ) switch (m_group) { case Group_Y : Plot_AddHLine( this, 16, 61, 89, 171); Plot_AddHLine( this, 235, 220, 20, 60); break; case Group_U : case Group_V : Plot_AddHLine( this, 16, 61, 89, 171); Plot_AddHLine( this, 240, 220, 20, 60); break; case Group_Sat : Plot_AddHLine( this, 88, 255, 0, 255); Plot_AddHLine( this, 118, 220, 20, 60); break; default : ; } PlotPicker* picker = new PlotPicker( canvas, &PerStreamType[m_type], m_group, &m_curves ); connect( picker, SIGNAL( moved( const QPointF& ) ), SLOT( onPickerMoved( const QPointF& ) ) ); connect( picker, SIGNAL( selected( const QPointF& ) ), SLOT( onPickerMoved( const QPointF& ) ) ); connect( axisWidget( QwtPlot::xBottom ), SIGNAL( scaleDivChanged() ), SLOT( onXScaleChanged() ) ); // legend m_legend = new PlotLegend(); connect( this, SIGNAL( legendDataChanged( const QVariant &, const QList<QwtLegendData> & ) ), m_legend, SLOT( updateLegend( const QVariant &, const QList<QwtLegendData> & ) ) ); updateLegend(); }
int QwtPlotWidget::interpret(const char *command, double *x, double *y) { if(command == NULL) return -1; line = command; if (isCommand("setCurveData(")) { if(x == NULL) return -1; if(y == NULL) return -1; int c,count; sscanf(command,"setCurveData(%d,%d",&c,&count); if(c<0 || c>=nCurves) return -1; if(curves[c] != NULL) curves[c]->setData(x,y,count); } else if(isCommand("replot(")) { replot(); } else if(isCommand("setTitle(")) { QString text; if(getText(command,text) != 0) return -1; setTitle(text); } else if(isCommand("setCanvasBackground(")) { int r,g,b; sscanf(command,"setCanvasBackground(%d,%d,%d",&r,&g,&b); setCanvasBackground(QColor(r,g,b)); } else if(isCommand("enableOutline(")) { int val; sscanf(command,"enableOutline(%d",&val); if( val == 0 || val == 1 ) { //xx enableOutline(val); //xx setOutlineStyle(Qwt::Rect ); } else { //xx enableOutline( 1 ); //xx setOutlineStyle(Qwt::Cross ); } } else if(isCommand("setOutlinePen(")) { int r,g,b; sscanf(command,"setOutlinePen(%d,%d,%d",&r,&g,&b); //xx setOutlinePen(QColor(r,g,b)); } else if(isCommand("setAutoLegend(")) { int val; sscanf(command,"setAutoLegend(%d",&val); //xx setAutoLegend(val); autolegend = val; } else if(isCommand("enableLegend(")) { int val; sscanf(command,"enableLegend(%d",&val); enablelegend = val; } else if(isCommand("setLegendPos(")) { int val; sscanf(command,"setLegendPos(%d",&val); if(opt.arg_debug) printf("SetLegendPos begin\n");; if(legend == NULL) legend = new QwtLegend(); if(opt.arg_debug) printf("SetLegendPos 1\n");; legend->setItemMode(QwtLegend::ClickableItem); if(opt.arg_debug) printf("SetLegendPos 2\n");; switch(val) { case PV::LeftLegend: insertLegend(legend, QwtPlot::LeftLegend); break; case PV::RightLegend: insertLegend(legend, QwtPlot::RightLegend); break; case PV::TopLegend: insertLegend(legend, QwtPlot::TopLegend); break; default: insertLegend(legend, QwtPlot::BottomLegend); break; } if(opt.arg_debug) printf("SetLegendPos end\n");; } else if(isCommand("setLegendFrameStyle(")) { int val; sscanf(command,"setLegendFrameStyle(%d",&val); legendframestyle = val; if(legend != NULL) legend->setFrameStyle(legendframestyle); } else if(isCommand("enableGridXMin(")) { grid.enableXMin(true); } else if(isCommand("setGridMajPen(")) { int r,g,b,style; sscanf(command,"setGridMajPen(%d,%d,%d,%d",&r,&g,&b,&style); grid.setMajPen(QPen(QColor(r,g,b),0,(Qt::PenStyle) style)); } else if(isCommand("setGridMinPen(")) { int r,g,b,style; sscanf(command,"setGridMinPen(%d,%d,%d,%d",&r,&g,&b,&style); grid.setMinPen(QPen(QColor(r,g,b),0,(Qt::PenStyle) style)); } else if(isCommand("enableAxis(")) { int pos; sscanf(command,"enableAxis(%d",&pos); enableAxis(pos); } else if(isCommand("setAxisTitle(")) { int pos; QString text; sscanf(command,"setAxisTitle(%d",&pos); if(getText(command,text) != 0) return -1; setAxisTitle(pos,text); } else if(isCommand("setAxisOptions(")) { int pos,val; sscanf(command,"setAxisOptions(%d,%d",&pos,&val); //xx setAxisOptions(pos,val); } else if(isCommand("setAxisMaxMajor(")) { int pos,val; sscanf(command,"setAxisMaxMajor(%d,%d",&pos,&val); setAxisMaxMajor(pos,val); } else if(isCommand("setAxisMaxMinor(")) { int pos,val; sscanf(command,"setAxisMaxMinor(%d,%d",&pos,&val); setAxisMaxMinor(pos,val); } else if(isCommand("insertCurve(")) { int pos; QString text; sscanf(command,"insertCurve(%d",&pos); if(getText(command,text) != 0) return -1; if(pos<0 || pos>=nCurves) return -1; //xx removeCurve( curves[pos] ); //xx curves[pos] = insertCurve(text); if(curves[pos] != NULL) delete curves[pos]; if(opt.arg_debug) printf("new QwtPlotCurve(%s)\n",(const char *) text.toUtf8()); curves[pos] = new QwtPlotCurve(text); curves[pos]->attach(this); if(legend != NULL) { QWidget *w = legend->find(curves[pos]); if(w != NULL) { if(opt.arg_debug) printf("setChecked(%d)\n",autolegend); ((QwtLegendItem *)w)->setChecked(autolegend); } } replot(); //if(autolegend && legend != NULL) curves[pos]->updateLegend(legend); } else if(isCommand("removeCurve(")) { int pos; sscanf(command,"removeCurve(%d",&pos); if(pos<0 || pos>=nCurves) return -1; //xx removeCurve( curves[pos] ); if(curves[pos] != NULL) curves[pos]->detach(); if(curves[pos] != NULL) delete curves[pos]; curves[pos] = NULL; } else if(isCommand("setCurvePen(")) { int pos,r,g,b,width,style; sscanf(command,"setCurvePen(%d,%d,%d,%d,%d,%d",&pos,&r,&g,&b,&width,&style); if(pos<0 || pos>=nCurves) return -1; //xx setCurvePen(curves[pos],QPen(QColor(r,g,b),width,(Qt::PenStyle) style)); QPen pen(QColor(r,g,b)); pen.setWidth(width); pen.setStyle((Qt::PenStyle) style); if(curves[pos] != NULL) curves[pos]->setPen(pen); } else if(isCommand("setCurveSymbol(")) { int pos,symbol,r1,g1,b1,r2,g2,b2,w,h; sscanf(command,"setCurveSymbol(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&pos,&symbol, &r1,&g1,&b1,&r2,&g2,&b2,&w,&h); if(pos<0 || pos>=nCurves) return -1; //xx setCurveSymbol(curves[pos], QwtSymbol((QwtSymbol::Style) symbol, QColor(r1,g1,b1), QColor(r2,g2,b2), QSize(w,h))); if(curves[pos] != NULL) curves[pos]->setSymbol(QwtSymbol((QwtSymbol::Style) symbol, QColor(r1,g1,b1), QColor(r2,g2,b2), QSize(w,h))); } else if(isCommand("setCurveYAxis(")) { int pos,pos2; sscanf(command,"setCurveYAxis(%d,%d",&pos,&pos2); if(pos<0 || pos>=nCurves) return -1; //xx setCurveYAxis(curves[pos],pos2); rl2013 if(curves[pos] != NULL) curves[pos]->setYAxis(pos2); } else if(isCommand("insertMarker(")) { int pos; sscanf(command,"insertMarker(%d",&pos); if(pos<0 || pos>=nMarker) return -1; //xx marker[pos] = insertMarker(); if(marker[pos] != NULL) delete marker[pos]; marker[pos] = new QwtPlotMarker(); marker[pos]->attach(this); } else if(isCommand("setMarkerLineStyle(")) { int pos,style; sscanf(command,"setMarkerLineStyle(%d,%d",&pos,&style); if(pos<0 || pos>=nMarker) return -1; //xx setMarkerLineStyle(marker[pos],(QwtMarker::LineStyle) style); if(marker[pos] != NULL) marker[pos]->setLineStyle((QwtPlotMarker::LineStyle) style); } else if(isCommand("setMarkerPos(")) { int pos; float x,y; sscanf(command,"setMarkerPos(%d,%f,%f",&pos,&x,&y); if(pos<0 || pos>=nMarker) return -1; //xx setMarkerPos(marker[pos],x,y); if(marker[pos] != NULL) marker[pos]->setValue(x,y); } else if(isCommand("setMarkerLabelAlign(")) { int pos,align; sscanf(command,"setMarkerLabelAlign(%d,%d",&pos,&align); if(pos<0 || pos>=nMarker) return -1; //xx setMarkerLabelAlign(marker[pos],align); if(marker[pos] != NULL) marker[pos]->setLabelAlignment((Qt::Alignment) align); } else if(isCommand("setMarkerLabel(")) { int pos; QString text; sscanf( command, "setMarkerLabel(%d",&pos ); if(getText(command, text) != 0 ) return -1; //xx setMarkerLabel(marker[pos], text ); if(marker[pos] != NULL) marker[pos]->setLabel(text); } else if(isCommand("setMarkerPen(")) { int pos,r,g,b,style; sscanf(command,"setMarkerPen(%d,%d,%d,%d,%d",&pos,&r,&g,&b,&style); if(pos<0 || pos>=nMarker) return -1; //xx setMarkerPen(marker[pos],QPen(QColor(r,g,b),0,(Qt::PenStyle) style)); if(marker[pos] != NULL) marker[pos]->setLinePen(QPen(QColor(r,g,b))); } else if(isCommand("setMarkerFont(")) { int pos,size,style; QString family; sscanf(command,"setMarkerFont(%d,%d,%d",&pos,&size,&style); if(pos<0 || pos>=nMarker) return -1; if(getText(command,family) != 0) return -1; //xx setMarkerFont(marker[pos],QFont(family,size,style)); } else if(isCommand("setMarkerSymbol(")) { int pos,symbol,r1,g1,b1,r2,g2,b2,w,h; sscanf(command,"setMarkerSymbol(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &pos,&symbol,&r1,&g1,&b1,&r2,&g2,&b2,&w,&h); if(pos<0 || pos>=nMarker) return -1; //xx setMarkerSymbol(marker[pos], QwtSymbol((QwtSymbol::Style) symbol, QColor(r1,g1,b1), QColor(r2,g2,b2), QSize(w,h))); if(marker[pos] != NULL) marker[pos]->setSymbol(QwtSymbol((QwtSymbol::Style) symbol, QColor(r1,g1,b1), QColor(r2,g2,b2), QSize(w,h))); } else if(isCommand("insertLineMarker(")) { int pos,pos2; QString text; sscanf(command,"insertLineMarker(%d,%d",&pos,&pos2); if(getText(command,text) != 0) return -1; if(pos<0 || pos>=nMarker) return -1; //xx marker[pos] = insertLineMarker(text, pos2); if(marker[pos] != NULL) delete marker[pos]; marker[pos] = new QwtPlotMarker(); marker[pos]->attach(this); if(marker[pos] != NULL) marker[pos]->setLabel(text); } else if( isCommand("setAxisScaleDraw(")) { int pos; QString qtext; char text[1024]; sscanf( command, "setAxisScaleDraw(%d",&pos ); if( getText(command, qtext) != 0 ) return -1; if(qtext.length() < ((int) sizeof(text) -1)) { strcpy(text,qtext.toUtf8()); } else { strcpy(text,"text too long"); } if(opt.arg_debug) printf("setAxisScaleDraw(%s)\n",text); setAxisScaleDraw( pos, new UserScaleDraw( text )); } else if( isCommand("setAxisScale(")) { int pos; float min,max,step; sscanf( command, "setAxisScale(%d,%f,%f,%f",&pos ,&min, &max, &step); if(opt.arg_debug) printf("setAxisScale(%d,%f,%f,%f)\n",pos,min,max,step); setAxisScale(pos,min,max,step); } else { return -1; } return 0; }
RealtimePlot::RealtimePlot() : pwrCurve(NULL), showPowerState(Qt::Checked), showPow30sState(Qt::Checked), showHrState(Qt::Checked), showSpeedState(Qt::Checked), showCadState(Qt::Checked), showAltState(Qt::Checked), smooth(0) { setInstanceName("Realtime Plot"); //insertLegend(new QwtLegend(), QwtPlot::BottomLegend); pwr30Data = new Realtime30PwrData; pwrData = new RealtimePwrData; altPwrData = new RealtimePwrData; spdData = new RealtimeSpdData; hrData = new RealtimeHrData; cadData = new RealtimeCadData; // Setup the axis (of evil :-) setAxisTitle(yLeft, "Watts"); setAxisTitle(yRight, "Cadence / HR"); setAxisTitle(yRight2, "Speed"); setAxisTitle(xBottom, "Seconds Ago"); setAxisMaxMinor(xBottom, 0); setAxisMaxMinor(yLeft, 0); setAxisMaxMinor(yLeft2, 0); setAxisMaxMinor(yRight, 0); setAxisMaxMinor(yRight2, 0); QPalette pal; setAxisScale(yLeft, 0, 500); // watts pal.setColor(QPalette::WindowText, GColor(CPOWER)); pal.setColor(QPalette::Text, GColor(CPOWER)); axisWidget(QwtPlot::yLeft)->setPalette(pal); axisWidget(QwtPlot::yLeft)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(yRight, 0, 230); // cadence / hr pal.setColor(QPalette::WindowText, GColor(CHEARTRATE)); pal.setColor(QPalette::Text, GColor(CHEARTRATE)); axisWidget(QwtPlot::yRight)->setPalette(pal); axisWidget(QwtPlot::yRight)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(xBottom, MAXSAMPLES, 0, 15); // time ago pal.setColor(QPalette::WindowText, GColor(CPLOTMARKER)); pal.setColor(QPalette::Text, GColor(CPLOTMARKER)); axisWidget(QwtPlot::xBottom)->setPalette(pal); axisWidget(QwtPlot::xBottom)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScale(yRight2, 0, 60); // speed km/h - 60kmh on a turbo is good going! pal.setColor(QPalette::WindowText, GColor(CSPEED)); pal.setColor(QPalette::Text, GColor(CSPEED)); axisWidget(QwtPlot::yRight2)->setPalette(pal); axisWidget(QwtPlot::yRight2)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisLabelRotation(yRight2,90); setAxisLabelAlignment(yRight2,Qt::AlignVCenter); enableAxis(xBottom, false); // very little value and some cpu overhead enableAxis(yLeft, true); enableAxis(yRight, true); enableAxis(yRight2, true); // 30s Power curve pwr30Curve = new QwtPlotCurve("30s Power"); pwr30Curve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive pwr30Curve->attach(this); pwr30Curve->setYAxis(QwtPlot::yLeft); // Power curve pwrCurve = new QwtPlotCurve("Power"); //pwrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); pwrCurve->setData(pwrData); pwrCurve->attach(this); pwrCurve->setYAxis(QwtPlot::yLeft); altPwrCurve = new QwtPlotCurve("Alt Power"); //pwrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); altPwrCurve->setData(altPwrData); altPwrCurve->attach(this); altPwrCurve->setYAxis(QwtPlot::yLeft); // HR hrCurve = new QwtPlotCurve("HeartRate"); //hrCurve->setRenderHint(QwtPlotItem::RenderAntialiased); hrCurve->setData(hrData); hrCurve->attach(this); hrCurve->setYAxis(QwtPlot::yRight); // Cadence cadCurve = new QwtPlotCurve("Cadence"); //cadCurve->setRenderHint(QwtPlotItem::RenderAntialiased); cadCurve->setData(cadData); cadCurve->attach(this); cadCurve->setYAxis(QwtPlot::yRight); // Speed spdCurve = new QwtPlotCurve("Speed"); //spdCurve->setRenderHint(QwtPlotItem::RenderAntialiased); spdCurve->setData(spdData); spdCurve->attach(this); spdCurve->setYAxis(QwtPlot::yRight2); // Load // lodCurve = new QwtPlotCurve("Load"); // //lodCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // QPen lodpen = QPen(QColor(128,128,128)); // lodpen.setWidth(2.0); // lodCurve->setPen(lodpen); // QColor brush_color = QColor(124, 91, 31); // brush_color.setAlpha(64); // lodCurve->setBrush(brush_color); // fill below the line // lodCurve->setData(lodData); // lodCurve->attach(this); // lodCurve->setYAxis(QwtPlot::yLeft); canvas()->setFrameStyle(QFrame::NoFrame); configChanged(); // set colors }
void PowerHist::recalc(bool force) { QVector<unsigned int> *array = NULL; QVector<unsigned int> *selectedArray = NULL; int arrayLength = 0; // lets make sure we need to recalculate if (force == false && LASTsource == source && LASTcache == cache && LASTrideItem == rideItem && LASTseries == series && LASTshade == shade && LASTuseMetricUnits == context->athlete->useMetricUnits && LASTlny == lny && LASTzoned == zoned && LASTbinw == binw && LASTwithz == withz && LASTdt == dt && LASTabsolutetime == absolutetime) { return; // nothing has changed } else { // remember for next time LASTsource = source; LASTcache = cache; LASTrideItem = rideItem; LASTseries = series; LASTshade = shade; LASTuseMetricUnits = context->athlete->useMetricUnits; LASTlny = lny; LASTzoned = zoned; LASTbinw = binw; LASTwithz = withz; LASTdt = dt; LASTabsolutetime = absolutetime; } if (source == Ride && !rideItem) return; // make sure the interval length is set if not plotting metrics if (source != Metric && dt <= 0) return; if (source == Metric) { // we use the metricArray array = &metricArray; arrayLength = metricArray.size(); selectedArray = NULL; } else if (series == RideFile::watts && zoned == false) { array = &wattsArray; arrayLength = wattsArray.size(); selectedArray = &wattsSelectedArray; } else if ((series == RideFile::watts || series == RideFile::wattsKg) && zoned == true) { array = &wattsZoneArray; arrayLength = wattsZoneArray.size(); selectedArray = &wattsZoneSelectedArray; } else if (series == RideFile::aPower && zoned == false) { array = &aPowerArray; arrayLength = aPowerArray.size(); selectedArray = &aPowerSelectedArray; } else if (series == RideFile::wattsKg && zoned == false) { array = &wattsKgArray; arrayLength = wattsKgArray.size(); selectedArray = &wattsKgSelectedArray; } else if (series == RideFile::nm) { array = &nmArray; arrayLength = nmArray.size(); selectedArray = &nmSelectedArray; } else if (series == RideFile::hr && zoned == false) { array = &hrArray; arrayLength = hrArray.size(); selectedArray = &hrSelectedArray; } else if (series == RideFile::hr && zoned == true) { array = &hrZoneArray; arrayLength = hrZoneArray.size(); selectedArray = &hrZoneSelectedArray; } else if (series == RideFile::kph) { array = &kphArray; arrayLength = kphArray.size(); selectedArray = &kphSelectedArray; } else if (series == RideFile::cad) { array = &cadArray; arrayLength = cadArray.size(); selectedArray = &cadSelectedArray; } RideFile::SeriesType baseSeries = (series == RideFile::wattsKg) ? RideFile::watts : series; // null curve please -- we have no data! if (!array || arrayLength == 0 || (source == Ride && !rideItem->ride()->isDataPresent(baseSeries))) { // create empty curves when no data const double zero = 0; curve->setData(&zero, &zero, 0); curveSelected->setData(&zero, &zero, 0); updatePlot(); return; } // binning of data when not zoned - we can't zone for series besides // watts and hr so ignore zoning for those data series if (zoned == false || (zoned == true && (series != RideFile::watts && series != RideFile::wattsKg && series != RideFile::hr))) { // we add a bin on the end since the last "incomplete" bin // will be dropped otherwise int count = int(ceil((arrayLength - 1) / (binw)))+1; // allocate space for data, plus beginning and ending point QVector<double> parameterValue(count+2, 0.0); QVector<double> totalTime(count+2, 0.0); QVector<double> totalTimeSelected(count+2, 0.0); int i; for (i = 1; i <= count; ++i) { double high = i * round(binw/delta); double low = high - round(binw/delta); if (low==0 && !withz) low++; parameterValue[i] = high*delta; totalTime[i] = 1e-9; // nonzero to accomodate log plot totalTimeSelected[i] = 1e-9; // nonzero to accomodate log plot while (low < high && low<arrayLength) { if (selectedArray && (*selectedArray).size()>low) totalTimeSelected[i] += dt * (*selectedArray)[low]; totalTime[i] += dt * (*array)[low++]; } } totalTime[i] = 1e-9; // nonzero to accomodate log plot totalTimeSelected[i] = 1e-9; // nonzero to accomodate log plot parameterValue[i] = i * delta * binw; totalTime[0] = 1e-9; totalTimeSelected[0] = 1e-9; parameterValue[0] = 0; // convert vectors from absolute time to percentage // if the user has selected that if (!absolutetime) { percentify(totalTime, 1); percentify(totalTimeSelected, 1); } curve->setData(parameterValue.data(), totalTime.data(), count + 2); curveSelected->setData(parameterValue.data(), totalTimeSelected.data(), count + 2); QwtScaleDraw *sd = new QwtScaleDraw; sd->setTickLength(QwtScaleDiv::MajorTick, 3); setAxisScaleDraw(QwtPlot::xBottom, sd); // HR typically starts at 80 or so, rather than zero // lets crop the chart so we can focus on the data // if we're working with HR data... minX=0; if (!withz && series == RideFile::hr) { for (int i=1; i<hrArray.size(); i++) { if (hrArray[i] > 0.1) { minX = i; break; } } } setAxisScale(xBottom, minX, parameterValue[count + 1]); // we only do zone labels when using absolute values refreshZoneLabels(); refreshHRZoneLabels(); } else { // we're not binning instead we are prettyfing the columnar // display in much the same way as the weekly summary workds // Each zone column will have 4 points QVector<double> xaxis (array->size() * 4); QVector<double> yaxis (array->size() * 4); QVector<double> selectedxaxis (selectedArray->size() * 4); QVector<double> selectedyaxis (selectedArray->size() * 4); // samples to time for (int i=0, offset=0; i<array->size(); i++) { double x = (double) i - 0.5; double y = dt * (double)(*array)[i]; xaxis[offset] = x +0.05; yaxis[offset] = 0; offset++; xaxis[offset] = x+0.05; yaxis[offset] = y; offset++; xaxis[offset] = x+0.95; yaxis[offset] = y; offset++; xaxis[offset] = x +0.95; yaxis[offset] = 0; offset++; } for (int i=0, offset=0; i<selectedArray->size(); i++) { double x = (double)i - 0.5; double y = dt * (double)(*selectedArray)[i]; selectedxaxis[offset] = x +0.05; selectedyaxis[offset] = 0; offset++; selectedxaxis[offset] = x+0.05; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x+0.95; selectedyaxis[offset] = y; offset++; selectedxaxis[offset] = x +0.95; selectedyaxis[offset] = 0; offset++; } if (!absolutetime) { percentify(yaxis, 2); percentify(selectedyaxis, 2); } // set those curves curve->setData(xaxis.data(), yaxis.data(), xaxis.size()); curveSelected->setData(selectedxaxis.data(), selectedyaxis.data(), selectedxaxis.size()); // zone scale draw if ((series == RideFile::watts || series == RideFile::wattsKg) && zoned && rideItem && rideItem->zones) { setAxisScaleDraw(QwtPlot::xBottom, new ZoneScaleDraw(rideItem->zones, rideItem->zoneRange())); if (rideItem->zoneRange() >= 0) setAxisScale(QwtPlot::xBottom, -0.99, rideItem->zones->numZones(rideItem->zoneRange()), 1); else setAxisScale(QwtPlot::xBottom, -0.99, 0, 1); } // hr scale draw int hrRange; if (series == RideFile::hr && zoned && rideItem && context->athlete->hrZones() && (hrRange=context->athlete->hrZones()->whichRange(rideItem->dateTime.date())) != -1) { setAxisScaleDraw(QwtPlot::xBottom, new HrZoneScaleDraw(context->athlete->hrZones(), hrRange)); if (hrRange >= 0) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->hrZones()->numZones(hrRange), 1); else setAxisScale(QwtPlot::xBottom, -0.99, 0, 1); } // watts zoned for a time range if (source == Cache && zoned && (series == RideFile::watts || series == RideFile::wattsKg) && context->athlete->zones()) { setAxisScaleDraw(QwtPlot::xBottom, new ZoneScaleDraw(context->athlete->zones(), 0)); if (context->athlete->zones()->getRangeSize()) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->zones()->numZones(0), 1); // use zones from first defined range } // hr zoned for a time range if (source == Cache && zoned && series == RideFile::hr && context->athlete->hrZones()) { setAxisScaleDraw(QwtPlot::xBottom, new HrZoneScaleDraw(context->athlete->hrZones(), 0)); if (context->athlete->hrZones()->getRangeSize()) setAxisScale(QwtPlot::xBottom, -0.99, context->athlete->hrZones()->numZones(0), 1); // use zones from first defined range } setAxisMaxMinor(QwtPlot::xBottom, 0); } setYMax(); configChanged(); // setup the curve colors to appropriate values updatePlot(); }
Plot::Plot(QWidget *parent):QwtPlot( parent ) { setAutoReplot( false ); setTitle( "FFT" ); QwtPlotCanvas *canvas = new QwtPlotCanvas(); canvas->setBorderRadius( 10 ); setCanvas( canvas ); setCanvasBackground( QColor( "MidnightBlue" ) ); // legend QwtLegend *legend = new QwtLegend; insertLegend( legend, QwtPlot::BottomLegend ); // grid QwtPlotGrid *grid = new QwtPlotGrid; grid->enableXMin( true ); grid->setMajorPen( Qt::white, 0, Qt::DotLine ); grid->setMinorPen( Qt::gray, 0 , Qt::DotLine ); grid->attach( this ); // axes //enableAxis( QwtPlot::yRight ); setAxisTitle( QwtPlot::xBottom, "Frequency [kHz]" ); setAxisTitle( QwtPlot::yLeft, "Amplitude " ); //setAxisTitle( QwtPlot::yRight, "Phase [deg]" ); setAxisMaxMajor( QwtPlot::xBottom, 6 ); setAxisMaxMinor( QwtPlot::xBottom, 9 ); //setAxisScale(QwtPlot::xBottom,0.01,100); //setAxisScaleEngine( QwtPlot::xBottom, ScaleEngine_Lin_X ); // setAxisScaleEngine(QwtPlot::xBottom, new QwtLogScaleEngine ); // curves d_curve1 = new QwtPlotCurve( "Amplitude Ch1" ); d_curve1->setRenderHint( QwtPlotItem::RenderAntialiased ); d_curve1->setPen( Qt::red ); d_curve1->setLegendAttribute( QwtPlotCurve::LegendShowLine ); d_curve1->setYAxis( QwtPlot::yLeft ); d_curve1->attach( this ); m_Channel2=true; if(m_Channel2){ d_curve2 = new QwtPlotCurve( "Amplitude Ch2 " ); d_curve2->setRenderHint( QwtPlotItem::RenderAntialiased ); d_curve2->setPen( Qt::magenta ); d_curve2->setLegendAttribute( QwtPlotCurve::LegendShowLine ); d_curve2->setYAxis( QwtPlot::yLeft ); d_curve2->attach( this ); } d_average = new QwtPlotCurve( "Average Ch1" ); d_average->setRenderHint( QwtPlotItem::RenderAntialiased ); d_average->setPen( Qt::white ); d_average->setLegendAttribute( QwtPlotCurve::LegendShowLine ); d_average->setYAxis( QwtPlot::yLeft ); d_average->attach( this ); // marker d_marker1 = new QwtPlotMarker(); d_marker1->setValue( 0.0, 0.0 ); d_marker1->setLineStyle( QwtPlotMarker::VLine ); d_marker1->setLabelAlignment( Qt::AlignRight | Qt::AlignBottom ); d_marker1->setLinePen( Qt::green, 0, Qt::DashDotLine ); d_marker1->attach( this ); if(m_Channel2){ /* d_marker2 = new QwtPlotMarker(); d_marker2->setValue( 0.0, 0.0 ); d_marker2->setLineStyle( QwtPlotMarker::VLine ); d_marker2->setLabelAlignment( Qt::AlignRight | Qt::AlignBottom ); d_marker2->setLinePen( Qt::gray, 0, Qt::DashDotLine ); d_marker2->attach( this );*/ /* d_marker2 = new QwtPlotMarker(); d_marker2->setLineStyle( QwtPlotMarker::HLine ); d_marker2->setLabelAlignment( Qt::AlignRight | Qt::AlignBottom ); d_marker2->setLinePen( QColor( 200, 150, 0 ), 0, Qt::DashDotLine ); d_marker2->setSymbol( new QwtSymbol( QwtSymbol::Diamond, QColor( Qt::yellow ), QColor( Qt::green ), QSize( 8, 8 ) ) ); d_marker2->attach( this );*/ } //setDamp( 0.0 ); setAutoReplot( true ); }