日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qwt--散点图/函数图

發(fā)布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qwt--散点图/函数图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.Qwt庫

??????? QwtPlot是用來繪制二維圖像的widget。在它的畫板上可以無限制的顯示繪畫組件。繪畫組件可以是曲線(QwtPlotCurve)、標(biāo)記(QwtPlotMarker)、網(wǎng)格(QwtPlotGrid)、或者其它從QwtPlotItem繼承的組件。


2.簡單介紹:原文鏈接,原作者辛苦........

QwtPlot擁有4個axes(軸線):

yLeft? Y axis left of the canvas.
yRight?Y axis right of the canvas.
xBottom?X axis below the canvas.
xTop?X axis above the canvas.

常用函數(shù)接口:

setAxisTitle設(shè)置軸標(biāo)題
enableAxis主要是顯示xTop,yRight坐標(biāo)軸
setAxisMaxMajor設(shè)置某個某個坐標(biāo)軸擴(kuò)大比例尺的最大間隔數(shù)目
setAxisMaxMinor設(shè)置某個某個坐標(biāo)軸縮小比例尺的最大間隔數(shù)目
setAxisScale禁用自動縮放比例尺,為某個坐標(biāo)軸指定一個修改的比例尺
insertLegend添加圖例(標(biāo)注)

常用組件:

QwtPlotCurve曲線? 可以用曲線來完成散點圖等等......
QwtPlotMarker標(biāo)記
QwtPlotGrid網(wǎng)格
QwtPlotHistogram直方圖
other從QwtPlotItem繼承的組件
QwtPlotItemplot能顯示的類,如果想要實現(xiàn)自己繪畫圖形,要繼承此類實現(xiàn)rtti和draw接口
QwtPlotPanner平移器??? (用鼠標(biāo)左鍵平移)
QwtPlotMagnifier?放大器??? (用鼠標(biāo)滾輪縮放)
QwtPlotCanvas畫布
QwtScaleMap比例圖---可以提供一個邏輯區(qū)域到實際區(qū)域的坐標(biāo)轉(zhuǎn)換
QwtScaleWidget比例窗口
QwtScaleDiv比例布局
QwtLegent標(biāo)注
QwtPlotLayout布局管理器
QwtScaleDraw自畫坐標(biāo)軸
常見接口:
setPen設(shè)置畫筆
setData設(shè)置曲線的數(shù)據(jù)
setStyle設(shè)置曲線形式,點、直線、虛線等等
setCurveAttribute設(shè)置曲線屬性,一般設(shè)置Fitted
attch把曲線附加到QwlPlot上
下面看一個小例子,結(jié)果如下: 源代碼:
#include <QtGui/QApplication> #include <Qt/qmath.h> #include <QVector> #include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_plot_magnifier.h> #include <qwt_plot_panner.h> #include <qwt_legend.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QwtPlot plot(QwtText("CppQwtExample1")); plot.resize(640,400); plot.setAxisTitle(QwtPlot::xBottom, "x->"); //設(shè)置坐標(biāo)軸的名稱 plot.setAxisTitle(QwtPlot::yLeft, "y->"); plot.setAxisScale(QwtPlot::xBottom, 0.0, 2.0 * M_PI); //設(shè)置坐標(biāo)軸的范圍 plot.setAxisScale(QwtPlot::yLeft, -1.0, 1.0); plot.insertLegend(new QwtLegend(), QwtPlot::RightLegend); //設(shè)置右邊標(biāo)注 (void) new QwtPlotMagnifier( plot.canvas() ); //使用滾輪放大/縮小 (void) new QwtPlotPanner( plot.canvas() ); //使用鼠標(biāo)左鍵平移 //計算曲線數(shù)據(jù) QVector<double> xs; QVector<double> ys; for (double x = 0; x < 2.0 * M_PI; x+=(M_PI / 10.0)) { xs.append(x); ys.append(qSin(x)); } //構(gòu)造曲線數(shù)據(jù) QwtPointArrayData * const data = new QwtPointArrayData(xs, ys); QwtPlotCurve curve("Sine"); curve.setData(data);//設(shè)置數(shù)據(jù) curve.setStyle(QwtPlotCurve::Lines);//直線形式 curve.setCurveAttribute(QwtPlotCurve::Fitted, true);//是曲線更光滑 curve.setPen(QPen(Qt::blue));//設(shè)置畫筆 curve.attach(&plot);//把曲線附加到plot上 plot.show(); return a.exec(); }

3.使用QWT繪制科學(xué)圖表、繪圖

解釋QwtSimple:simple是qwt自帶的例子中最簡單的一個, 一共只有一百來行的代碼, 實現(xiàn)了數(shù)學(xué)中的正弦函數(shù)(sin())和余弦函數(shù)(cos())曲線。


4.我使用到的兩種情況


4.1 對函數(shù)進(jìn)行畫圖----曲線圖(這個功能很別致的!)

包含文件:#include <qlayout.h> #include <qwt_plot.h> #include <qwt_plot_marker.h> #include <qwt_plot_curve.h> #include <qwt_legend.h> #include <qwt_series_data.h> #include <qwt_plot_canvas.h> #include <qwt_plot_panner.h> #include <qwt_plot_magnifier.h> #include <qwt_text.h> #include <qwt_math.h> #include <math.h>把連續(xù)函數(shù)定義為全局函數(shù),輸入/返回值為double:double funcMy( doublef) {return 0.15*f; }定義序列數(shù)據(jù); class CArraySeriesDat:publicQwtSyntheticPointData { public:CArraySeriesDat(double(*y)(double)):QwtSyntheticPointData(100),d_y(y){ }virtual double y(double x) const { return d_y(x); }private:double(*d_y)(double);};自定義畫圖類:class Plot:publicQwtPlot { public:Plot( QWidget *parent = NULL);~Plot( );void drawArray();//畫圖函數(shù) protected:virtual void resizeEvent( QResizeEvent * ); private:void populateCos();void updateGradient(); };畫圖類初始化:Plot::Plot(QWidget*parent):QwtPlot( parent ) {// panning with the left mouse button(void) new QwtPlotPanner( canvas() );// zoom in/out with the wheel(void) new QwtPlotMagnifier( canvas() );setAutoFillBackground( true );setPalette( QPalette( QColor( 165, 193, 228 ) ) );updateGradient();setTitle("A Simple QwtPlot Demonstration");insertLegend(new QwtLegend(), QwtPlot::RightLegend);// axessetAxisTitle(xBottom, "x -->" );setAxisScale(xBottom, 0.0, 10.0);setAxisTitle(yLeft, "y -->");setAxisScale(yLeft, -1.0, 1.0);// canvascanvas()->setLineWidth( 1 );canvas()->setFrameStyle( QFrame::Box | QFrame::Plain );canvas()->setBorderRadius( 15 );QPalette canvasPalette( Qt::white );canvasPalette.setColor( QPalette::Foreground, QColor( 133, 190, 232 ) );canvas()->setPalette( canvasPalette ); }私有成員函數(shù)實現(xiàn):void Plot::updateGradient() {QPalette pal = palette();const QColor buttonColor = pal.color( QPalette::Button ); #ifdef Q_WS_X11// Qt 4.7.1: QGradient::StretchToDeviceMode is buggy on X11QLinearGradient gradient( rect().topLeft(), rect().bottomLeft() );gradient.setColorAt( 0.0, Qt::white );gradient.setColorAt( 0.7, buttonColor );gradient.setColorAt( 1.0, buttonColor );#elseQLinearGradient gradient( 0, 0, 0, 1 );gradient.setCoordinateMode( QGradient::StretchToDeviceMode );gradient.setColorAt( 0.0, Qt::white );gradient.setColorAt( 0.7, buttonColor );gradient.setColorAt( 1.0, buttonColor );#endifpal.setBrush( QPalette::Window, gradient );setPalette( pal ); }void Plot::resizeEvent( QResizeEvent *event ) {QwtPlot::resizeEvent( event ); #ifdef Q_WS_X11updateGradient(); #endif }畫圖函數(shù)實現(xiàn):void Plot::drawArray() {// Insert new curvesQwtPlotCurve *cSin = new QwtPlotCurve("y = sin(x)");cSin->setRenderHint(QwtPlotItem::RenderAntialiased);cSin->setLegendAttribute(QwtPlotCurve::LegendShowLine, true);cSin->setPen(QPen(Qt::red));cSin->attach(this);QwtPlotCurve *cCos = new QwtPlotCurve("y = cos(x)");cCos->setRenderHint(QwtPlotItem::RenderAntialiased);cCos->setLegendAttribute(QwtPlotCurve::LegendShowLine, true);cCos->setPen(QPen(Qt::blue));cCos->attach(this);CArraySeriesDat* ArraySeriesDat = new CArraySeriesDat(funcMy); //以函數(shù)指針的形式獲取曲線cCos->setData(ArraySeriesDat);return;}函數(shù)測試:int main(intargc,char**argv) {QApplication a(argc, argv);Plot *plot = new Plot();// We put a dummy widget around to have// so that Qt paints a widget background// when resizingQWidget window;QHBoxLayout *layout = new QHBoxLayout( &window );layout->setContentsMargins( 0, 0, 0, 0 );layout->addWidget( plot ); plot->drawArray();//畫圖...........window.resize(600,400);window.show();return a.exec(); }

4.2 散點圖(基本功能)

頭文件:

class CCruvePlot:publicQwtPlot { public:CCruvePlot();~CCruvePlot(void);public:void drawPlotCruve(); private:QwtPlotCurve * curve;QVector<double> xData;QVector<double> yData; };//實現(xiàn)文件: #include "cruvePlot.h" const int LineNum=7; const int PointNum=7; CCruvePlot::CCruvePlot(){} CCruvePlot::~CCruvePlot(void){}void CCruvePlot::drawPlotCruve() {//QMessageBox::information(this,"Running!","Running matlab Function.....");setTitle("A Simple QwtPlot Demonstration");//設(shè)置標(biāo)題insertLegend(new QwtLegend(), QwtPlot::RightLegend);//設(shè)置標(biāo)線的欄setAxisTitle(xBottom, "x -->");setAxisScale(xBottom, 0.0, 10.0);setAxisTitle(yLeft, "y -->");setAxisScale(yLeft, 0, 10.0);QwtPlotCurve *curve = new QwtPlotCurve("lineFirst");//實例化一條曲線curve->attach(this);double *x=new double[PointNum];double *y=new double[PointNum];for(int i=0;i<PointNum;i++) {x[i]=i;y[i]=i+3;}curve->setSamples (x,y,PointNum);//傳畫曲線的數(shù)據(jù)curve->setPen(QPen(Qt::red));QwtPlotCurve *curve2 = new QwtPlotCurve("lineSecond");//實例化另一條線curve2->attach(this);double *x2=new double[PointNum];double *y2=new double[PointNum];for(int i=0;i<PointNum;i++){x2[i]=i*3;y2[i]=i+3;}curve2->setSamples (x2,y2,PointNum);curve2->setPen(QPen(Qt::blue));return;}

4.3 對于QwtSymbol的使用,詳細(xì)參考此博客:http://blog.csdn.net/qustdjx/article/details/7940896

??? 為什么不封裝成類似Matlab的用法呢?

總結(jié)

以上是生活随笔為你收集整理的Qwt--散点图/函数图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。