利用QCustomePlot绘制热力图,瀑布图,频谱色图等
? ? ?有一個問題l困擾了我很多天,就是如何在QT中實現(xiàn)跟MATALB中imagesc函數(shù)一樣能夠根據(jù)二維數(shù)組存儲的數(shù)據(jù)的大小自動繪制不同顏色的圖形,就如下圖所示的瀑布圖。
? ? ? ?由于自己是邊學邊做,沒有經(jīng)過系統(tǒng)學習,很多不知道,一開始想自己手工擼代碼實現(xiàn),寫了大半天累的要死,后來突然搜索到兩篇關于瀑布圖的文章,最后學習了解了相關知識最后終于實現(xiàn)了自己想要的功能。?(所參考文章在最后)
先放部分代碼以及實現(xiàn)的功能,此部分代碼只是一個初步使用demo,功能后期完善再寫一個完善的
void MainWindow:: SetLofar_char()//顯示Lofar瀑布圖 {fp3 = ui->widget_lofar; //創(chuàng)建一個畫圖指針fp3->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);//可拖拽+可滾輪縮放// fp3->axisRect()->insetLayout() ->setInsetAlignment(0,Qt::AlignRight|Qt::AlignTop); //圖例置于右上/*Qt::AlignLeft|Qt::AlignTop); //圖例置于左上Qt::AlignCenter|Qt::AlignTop);//圖例置于中上Qt::AlignRight|Qt::AlignTop);//圖例置于右上Qt::AlignLeft|Qt::AlignCenter);//圖例置于左中Qt::AlignCenter); //圖例置于正中Qt::AlignRight|Qt::AlignCenter);//圖例置于右中Qt::AlignLeft|Qt::AlignBottom);//圖例置于左下Qt::AlignCenter|Qt::AlignBottom);//圖例置于中下*/// fp3->legend->setVisible(true);//顯示圖例fp3->xAxis->setLabel("頻率/Hz(單位:*10^4)");//x軸顯示文字fp3->yAxis->setLabel("幅度/dB");//y軸顯示文字fp3->xAxis->setRange(0,2.5);//當前X軸顯示范圍fp3->yAxis->setRange(-5,5);//當前y軸顯示范圍/* //每條曲線都會獨占一個graph()fp3->addGraph();fp3->graph(0)->setPen(QPen(Qt::blue));//曲線顏色fp3->graph(0)->setBrush(QBrush(QColor(0,255,255,20)));//曲線與X軸包圍區(qū)的顏色//自動調(diào)整XY軸的范圍,以便顯示出graph(0)中所有的點//給第一個graph設置rescaleAxes(),后續(xù)所有graph都設置rescaleAxes(true)即可實現(xiàn)顯示所有曲線fp3->graph(0)->rescaleAxes();*///通過傳遞的軸的QCustomPlot進行注冊,簡潔理解QCPColorMap的數(shù)據(jù)為(x軸,y軸;顏色,值value)m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);m_pColorMap->data()->setSize(1024,50);//設置整個圖(x,y)點數(shù)m_pColorMap->data()->setRange(QCPRange(0,2.5),QCPRange(-5,5));//setRange是設置X軸以及Y軸的范圍//顏色范圍 == 色條/* m_pColorScale = new QCPColorScale(fp3);fp3->plotLayout()->addElement(0,1,m_pColorScale);//默認右側添加色彩圖m_pColorScale->setType(QCPAxis::atRight);m_pColorScale->setDataRange(QCPRange(0, 100));//顏色范圍對應的取值范圍data_maxColorBar這里為測量得到的最大值來代表顏色的最大值m_pColorScale->axis()->ticker()->setTickCount(6);m_pColorScale->axis()->setLabel("色彩");//色條的名// m_pColorMap->setColorScale(m_pColorScale); //熱圖連接色條m_pColorMap->setGradient(QCPColorGradient::gpCold);//設置默認漸進色變化(可在QCPColorGradient中查看)// QSharedPointer<QCPColorGradient> colorLayout(new QCPColorGradient);//生成顏色漸進變化對象QMap<double, QColor> color_layout;m_pColorGradient = new QCPColorGradient();//自定義的漸進色變化對象//m_pColorGradient->setColorStops(colorLayout);//QMap<double, QColor> color_layout為;顏*色*布局范圍(double取值為0,1)m_pColorMap->setGradient(*m_pColorGradient);//設置漸進色變化m_pColorMap->rescaleDataRange();QCPMarginGroup *marginGroup = new QCPMarginGroup(fp3);fp3->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);m_pColorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);*/for(int x=0;x<=1024;x++){for(int y=0;y<50;y++){m_pColorMap->data()->setCell(x,y,qCos(x/10.0)+qSin(y/10.0));}}m_pColorMap->setGradient(QCPColorGradient::gpCold);//設置默認漸進色變化(可在QCPColorGradient中查看)m_pColorMap->rescaleDataRange(true);// 立即刷新圖像fp3->rescaleAxes();//自適應大小ui->widget_lofar->replot();}? ? 最后實現(xiàn)的效果圖:
關于漸變色的不同樣子可以自己選擇設置
?m_pColorMap->setGradient(QCPColorGradient::gpCold);//設置默認漸進色變化(可在QCPColorGradient中查看)m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);
這句代碼之后會在坐標軸上面出現(xiàn)這一坨黑乎乎的東西
//顏色范圍 == 色條
??? m_pColorScale = new QCPColorScale(fp3);
??? fp3->plotLayout()->addElement(0,1,m_pColorScale);//右側添加
?
這兩句是添加色條
?
?
?
?
按理說最后應該能實現(xiàn)根據(jù)點擊色條的顏色不同主窗口顏色變化,但是我沒有測試實現(xiàn),具體可以看參考文章1的代碼,如果有實現(xiàn)了可以交流下,我由于項目不需要就先跳過這部分。
這里主要應用的是QCustomPlot中的QCPColor相關的部分函數(shù)等,可以點進去查看
點進去可以在下面看到詳細的用法,下一篇文章我會再寫寫對于qcpcolormap里面手冊部分的翻譯
參考文章:
1:Qt——繪制瀑布圖/熱度圖
2:利用Hellocharts繪制頻譜瀑布圖(雨圖)
總結
以上是生活随笔為你收集整理的利用QCustomePlot绘制热力图,瀑布图,频谱色图等的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT设置坐标轴XY轴显示范围方法
- 下一篇: QT在windows平台安装使用MInG