利用QT实现瀑布图、Lofar谱图、色谱图,热力图(二)

关于问题详细描述可以看一下我之前的博文,之前我只是简单的介绍了一下这个功能,现在介绍一下如何具体x实现

https://blog.csdn.net/qq_21449473/article/details/103207224

 一、使用工具

QT+QCustomplot结合,利用QCustmPlot中的QCPColorMap功能

二、 实现步骤

第一步骤:初始化图纸

/*********************************************************************************
  *Author:  zyh
  *Version: 1.0 //版本
  *Date: 2020-01-08 //完成日期
  *Description: 主要实现设置第二张图纸//用于主要说明此程序文件完成的主要功能
                无输入值以及返回值 //与其他模块或函数的接口、输出值、取值范围、
                无/含义及参数间的控制、顺序、独立及依赖关系
**********************************************************************************/
void MainWindow::SetTwoGraph()  //设置第二张图纸
{
    fp3 = ui->widget_lofar; //创建一个画图指针

    fp3->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom| QCP::iSelectPlottables);//可拖拽+可滚轮缩放

  //  QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);//日期做X轴
   // dateTicker->setDateTimeFormat("hh:mm:ss");//日期格式(可参考QDateTime::fromString()函数)
    //fp3->xAxis->setTicker(dateTicker);//设置X轴为时间轴
    //fp3->xAxis->setTicker();


    fp3->xAxis->setLabel("时间/S");//x轴显示文字
    fp3->yAxis->setLabel("频率/Hz(单位:*10^4)");//y轴显示文字
    fp3->xAxis->setRange(0,50);//当前X轴显示范围
    fp3->yAxis->setRange(0,4.9);//当前y轴显示范围

    //每条曲线都会独占一个graph()
    fp3->addGraph();
    fp3->graph(0)->setPen(QPen(Qt::blue));//曲线颜色

    fp3->graph(0)->setBrush(QBrush(QColor(0,255,255,20)));//曲线与X轴包围区的颜色
    //自动调整XY轴的范围,以便显示出graph(0)中所有的点
    //给第一个graph设置rescaleAxes(),后续所有graph都设置rescaleAxes(true)即可实现显示所有曲线
   /* fp3->graph(0)->rescaleAxes();*/

    //通过传递的轴的QCustomPlot进行注册,简洁理解QCPColorMap的数据为(x轴,y轴;颜色,值value)
    m_pColorMap = new QCPColorMap(fp3->xAxis,fp3->yAxis);
    m_pColorMap->data()->setSize(51,4096);//设置整个图(x,y)点数,X轴50个点,y轴4096个点
    m_pColorMap->data()->setRange(QCPRange(0,50),QCPRange(0,4.9));//setRange是设置X轴以及Y轴的范围

//  for(int x=0;x<=100;x++)
//  {
//    for(int y=0;y<4096;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);

   // dataTimer =new QTimer;
    //connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
    //dataTimer->start(0); // Interval 0 means to refresh as fast as possible
// 立即刷新图像
    fp3->rescaleAxes();//自适应大小
    ui->widget_lofar->replot();
}

注意以下这一句很重要,是设置整个谱图的大小,,而且注意最好多留出来一个空位置,如果你需要填写50*100个点,那么你图纸大小最好设置51*101,不然可能会超出容量报错

    m_pColorMap->data()->setSize(51,4096);//设置整个图(x,y)点数,X轴50个点,y轴4096个点

第二步:定义个二维数组缓存数据

我是定义在.h文件中

注意,这个二维数组第一纬度的链表,应为在后面我需要一直在前面插入新的一竖行数据,用链表插入比较快,我一开始用的二维全部都是QVector类型,这样的话每次插入都要大量运算,耗费时间,注意第二纬度数组最好是QVector类型,应为第二纬度是一个竖行数据,最好的连续的,这样写入会快很多,所以就定义了如下的二维数据来存储数据,节省大量时间,运算速度快很多

 QList<QVector<double> > value_lofar;   //二维数组,第一维列表类型,第二维度Vector容器类存double类型数据,由于lofar是第一维度的添加QList,添加不耗时间,第二维度连续的存储Vector比较好

第三部:存储数据

以下是数据存储以及显示部分代码,我新来一行数据,就插入到之前二维数组前面,当插入超过49以后,删除最后一竖行数据,防止数据溢出出现问题,,然后通过一个二维for循环,利用setCell函数,把数据显示在图纸上,注意最后需要刷新一下才会显示,最终实现效果如上面所示

void MainWindow::show_Lofar()   //显示lofar瀑布图
{
    thread_GetData->lofar_chan1_y.resize(thread_GetData->freqDomain_Size/2);  //取fft中一半的数据显示即可
    thread_GetData->lofar_chan2_y.resize(thread_GetData->freqDomain_Size/2);

    if(value_lofar.size()>49)
    {
        value_lofar.removeLast();  //当lofar累积到了50个,删除最后面的数据,防止绘图溢出绘图区域
    }

    value_lofar.prepend(thread_GetData->lofar_chan1_y);//新来的数据一直往前面累加

    //要注意i代表X轴,j代表y轴(x,y)的点的数据,显示瀑布图
    //再把刚刚lofar数据0-98行,存到1-99行中空出第0行
    for (int i=0;i<value_lofar.size();i++)
    {
        for(int j=0;j<4096;j++)
        {
            m_pColorMap->data()->setCell(i,j,qRound(value_lofar[i][j]));
        }
    }
    //   m_pColorMap->setGradient(QCPColorGradient::gpJet);//设置默认渐进色变化(可在QCPColorGradient中查看)
    m_pColorMap->rescaleDataRange(true);
    // 立即刷新图像
    //fp3->graph(0)->setData();
    fp3->rescaleAxes();//自适应大小
    ui->widget_lofar->replot();
    //qDebug() << "帧数:"<< zhen ;  //调试用
}

最后提醒一下,大家一定要注意,这个setCells第三个参数虽然是double类型,但是实际我使用时候用double类型数据根本没用没法显示显示,只能显示整数,所以我加了qRound函数,把数据取整数,这样才能显示!!!!可能手册写错了,或者我用的不对,欢迎有知道的交流下。

 

 

  m_pColorMap->data()->setCell(i,j,qRound(value_lofar[i][j]));

以下是关于切换颜色变化部分的代码

/*********************************************************************************
  *Author:  zyh
  *Version: 1.0 //版本
  *Date: 2020-01-31 //完成日期
  *Description: 主要实现通过选择实现lofar谱的颜色变化    //用于主要说明此程序文件完成的主要功能
                无输入值以及返回值                    //与其他模块或函数的接口、输出值、取值范围、
                无                                //含义及参数间的控制、顺序、独立及依赖关系
**********************************************************************************/
void MainWindow::on_Box_ColorMap_currentTextChanged(const QString &arg1)
{
    if(ui->Box_ColorMap->currentText()=="gpGrayscale")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpGrayscale);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpHot")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpHot);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpCold")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpCold);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpNight")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpNight);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpCandy")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpCandy);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpGeography")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpGeography);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpIon")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpIon);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpThermal")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpThermal);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpPolar")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpPolar);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpSpectrum")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpSpectrum);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpJet")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpJet);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
    else if (ui->Box_ColorMap->currentText()=="gpHues")
    {
       m_pColorMap->setGradient(QCPColorGradient::gpHues);//设置默认渐进色变化(可在QCPColorGradient中查看)
    }
}

 比较简单,具体可以看手册

 

关于使用的demo:https://download.csdn.net/download/qq_21449473/15762423

  • 8
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值