因为项目需要用qt实现瀑布图效果,参考过很多博主的经验,效果图下图

来源

QCustomPlot之瀑布图(十五)_梁如风的博客-CSDN博客_qcustomplot 瀑布图

第一种类型的瀑布图实现了,大小固定,只是每个cell上的数据不一样,所以思路如该博主所述,每次更新cell数据即可。

第二种类型的瀑布图更符合我的项目需求,但是一直没有找到合适的实现方式。

来源利用QCustomePlot绘制热力图,瀑布图,频谱色图等_尘埃飞舞的博客-CSDN博客_qcustomplot频谱图

深入研究博主的思路发现,这种也不是我想要的瀑布图,因为显示范围依旧是固定的,只是不断新增数据,看起来像是瀑布效果

而实际我需要的是下面的效果,随着新数据到来,不断的对原图进行填充,超出一定显示范围后进行滚动

下面来说一下实现思路

  1. 创建QCPColorMap对象,绑定到对应的QCustomplot对象上
  2. 设置QCustomplot对象的显示显示范围和显示长度
  3. 给QCPColorMap对象新增数据,设置自适应坐标
  4. 重绘QCustomplot对象
  5. 重复2-4步骤

实现代码如下

void MainWindow::updateMapData(QCustomPlot *plot,QVector<QVector<double>>z,QString xlabel,QString ylabel,QString name,double showLen)
{plot->setInteractions(QCP::iRangeZoom | QCP::iSelectPlottables);int tlen = z.size();int flen = z[0].size();plot->xAxis->setLabel(xlabel);//x轴显示文字plot->yAxis->setLabel(ylabel);//y轴显示文字plot->xAxis->setRange(z.last().at(0),z.last().at(1));plot->yAxis->setRange(z.last().at(4)<showLen?0:z.last().at(4)-showLen,showLen,Qt::AlignLeft);if(plot->plottableCount() < 2){//通过传递的轴的QCustomPlot进行注册,简洁理解QCPColorMap的数据为(x轴,y轴;颜色,值value)QCPColorMap *m_pColorMap = new QCPColorMap(plot->xAxis,plot->yAxis);m_pColorMap->data()->setSize(flen,tlen-1);//设置整个图(x,y)点数m_pColorMap->data()->setRange(QCPRange(z.last().at(0),z.last().at(1)),QCPRange(0,z.last().at(5)));//setRange是设置X轴以及Y轴的范围for(int x=0;x<tlen-1;x++){for(int y=0;y<flen;y++){m_pColorMap->data()->setCell(y,x,z[x][y]);}}m_pColorMap->rescaleDataRange(true);}else{auto *colorMap = static_cast<QCPColorMap *>(plot->plottable(plot->plottableCount()-1));int valueSize = colorMap->data()->valueSize();colorMap->data()->setSize2(flen,valueSize+tlen-1);//设置整个图(x,y)点数colorMap->data()->setRange(QCPRange(z.last().at(0),z.last().at(1)),QCPRange(0,z.last().at(5)));//setRange是设置X轴以及Y轴的范围for(int x=0;x<tlen-1;x++){for(int y=0;y<flen;y++){colorMap->data()->setCell(y,valueSize+x,z[x][y]);}}colorMap->rescaleDataRange(true);}plot->replot(QCustomPlot::rpQueuedReplot);
}/*旧版本,通过新增QCPColorMap 对象实现*/
void MainWindow::updateMapData(QCustomPlot *plot,QVector<QVector<double>>z,QString xlabel,QString ylabel,QString name,bool zoom)
{plot->setInteractions(QCP::iRangeZoom | QCP::iSelectPlottables);int tlen = z.size();int flen = z[0].size();double showLen = ui->doubleSpinBox_showLen->value();plot->xAxis->setLabel(xlabel);//x轴显示文字plot->yAxis->setLabel(ylabel);//y轴显示文字if(zoom){double last_upper = plot->xAxis->range().upper;plot->xAxis->setRange(z.last().at(0),qMin(z.last().at(1),last_upper));}else{plot->xAxis->setRange(z.last().at(0),z.last().at(1));}plot->yAxis->setRange(z.last().at(4)<showLen?0:z.last().at(4)-showLen,showLen,Qt::AlignLeft);//通过传递的轴的QCustomPlot进行注册,简洁理解QCPColorMap的数据为(x轴,y轴;颜色,值value)QCPColorMap *m_pColorMap = new QCPColorMap(plot->xAxis,plot->yAxis);m_pColorMap->data()->setSize(flen,tlen-1);//设置整个图(x,y)点数m_pColorMap->data()->setRange(QCPRange(z.last().at(0),z.last().at(1)),QCPRange(z.last().at(4),z.last().at(5)));//setRange是设置X轴以及Y轴的范围for(int x=0;x<tlen-1;x++){for(int y=0;y<flen;y++){m_pColorMap->data()->setCell(y,x,z[x][y]);}}m_pColorMap->rescaleDataRange(true);plot->replot(QCustomPlot::rpQueuedReplot);
}

关键部分:通过判断QCustomplot对象的plottable个数,plottable(0)为graph本身

  • 小于2,创建QCPColorMap对象
  • 否则,找到已经存在的QCPColorMap,对其进行操作
    • 也就是进行之前所述的2-4步骤

需要注意的一点是QCPColorMap的reSize()函数调用后,会将原有的data进行初始化,也就是丢失掉原有数据,所以无法使用。

Qt——绘制瀑布图/热度图_kiwen_su的博客-CSDN博客_qchart瀑布图

if (sec_xAddTime >= sec_xAxisEndTime)//平;移;图
{int nx = sec_xAxisEndTime - sec_xAxisStartTime;//x轴上;的点;数sec_xAxisEndTime += nx;//向右;平移;nx秒sec_xAxisStartTime += nx;clearAllDatas();//清;空之;前的数;据ui.heatMap->xAxis->setRange(sec_xAxisStartTime, sec_xAxisEndTime);//x轴;范围m_pColorMap->data()->setSize(nx, len_maxHeight);//重;新;设;置;范围m_pColorMap->data()->setRange(QCPRange(sec_xAxisStartTime, sec_xAxisEndTime), QCPRange(0, len_maxHeight)); //(x,y)点对应;取值;范;围//QCPColorMapData *existData = m_pColorMap->data();//m_pColorMap->setData(existData, true);//m_pColorMap->data()->recalculateDataBounds();//m_pColorMap->rescaleDataRange(true);
}
uint x = sec_xAddTime - sec_xAxisStartTime;for (int i = 0; i < (data.vec_Height.size()-1); i++)
{for (int y = data.vec_Height.at(i); y <= data.vec_Height.at(i+1); y++){m_pColorMap->data()->setCell(x, y, data.vec_Value.at(i));//设;置;数据}
}

这位博主注释掉的4行代码就是想实现这个思路,但是由于resize之后,data已经为空,所以导致数据丢失,导致只有最后一行数据

官方注释如下:
Resizes the data array to have keySize cells in the key dimension and valueSize cells in the value dimension.
The current data is discarded and the map cells are set to 0, unless the map had already the requested size.

我的实现思路是重写resize函数,结果还是比较令人满意的,提供我的代码,仅供参考

重写QCustomplot库的reSize函数-C++文档类资源-CSDN下载

QCPColorMap实现瀑布图相关推荐

  1. 利用QCustomePlot绘制热力图,瀑布图,频谱色图等

    有一个问题l困扰了我很多天,就是如何在QT中实现跟MATALB中imagesc函数一样能够根据二维数组存储的数据的大小自动绘制不同颜色的图形,就如下图所示的瀑布图. 由于自己是边学边做,没有经过系统学 ...

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

    关于问题详细描述可以看一下我之前的博文,之前我只是简单的介绍了一下这个功能,现在介绍一下如何具体x实现 https://blog.csdn.net/qq_21449473/article/detail ...

  3. PyQt5 使用QCustomPlot2动态绘制频谱瀑布图(一)

    目前主要实现效果: 窗体ui草稿:设计排版.图表插入.QWidget提升. 功能:设置计时器,随时间更新频域上的瀑布图. QCustomPlot2是导师推荐的一款作图软件,相比之前用的matplotl ...

  4. 简介+原理+绘制,详解 Python「瀑布图」的整个制作流程!

    作者|黄伟呢 来源|数据分析与统计学之美 简介 瀑布图,由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水,所以被大家称之为瀑布图(Waterfall Plot),在企业经营分析.财务分析中使用较多, ...

  5. python绘制影像组学训练集、测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图)

    python绘制影像组学训练集.测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图) # 所有数据的瀑布图 tagets_all = df['label'] tagets_all = df. ...

  6. 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?(附代码)

    来源:大数据DT(ID:hzdashuju) 作者:屈希峰,资深Python工程师,知乎多个专栏作者 本文约8000字,建议阅读20分钟 柱状图是当前应用最广泛的图表之一,你几乎每天都可以在电子产品上 ...

  7. 如何用python画数据图-利用Python绘制数据的瀑布图的教程

    介绍 对于绘制某些类型的数据来说,瀑布图是一种十分有用的工具.不足为奇的是,我们可以使用Pandas和matplotlib创建一个可重复的瀑布图. 在往下进行之前,我想先告诉大家我指代的是哪种类型的图 ...

  8. fiddler 看懂瀑布图Timeline

    Fiddler Timeline 如图右边区域,主要用法是直观的显示页面各个元素的加载时间和顺序,其中fiddler的Timeline相比Chrome 的developer tools更为强大的地方是 ...

  9. 下如何画出频率瀑布图_用maftools一行代码画出瀑布图

    昨天本科的一个师姐问我关于瀑布图的画法,想要画个瀑布图,问我有没有有什么工具可以画的,目标图如下 于是给师姐介绍了maftools这个R包,这个R包功能非常强大,可以做各种各样的图,今天就拿瀑布图为例 ...

  10. tableau系列之如何将甘特图做成瀑布图

    瀑布图 如果你希望图表既能反映数据的多少,又能直观的反映出数据的增减变化.

最新文章

  1. 这五款Python工具都是最常用的,尤其是第三种,初学者必须掌握的
  2. 拒绝泡沫,客观评价!让我们从18个分立的视角来看AI
  3. 查杀linux线程指令
  4. 到2026年,非洲数据中心市场规模将达到50亿美元
  5. Jmeter(4)Http Cookie Manager
  6. 关于阿里基础设施,你要知道的都在这里
  7. [网络安全自学篇] 五十九.Windows安全缺陷利用之MS08-067远程代码执行及深度防御解析
  8. 【已解决】javaweb新建jsp文件报错
  9. 二分:[BJWC2008]秦腾与教学评估
  10. 架构整洁之道 pdf_代码有整洁之道,而架构同样有整洁之道
  11. SQL Server查询所有的表名、字段名、注释
  12. CSRF和SSRF漏洞
  13. c语言 步进电机 程序,步进电机加速启动C语言程序
  14. 2016年米其林指南—澳门小食篇 -吃遍澳门,就这12家!
  15. 启发式算法与机器学习的区别_使用强化学习训练受启发的四足机器人
  16. CCTV主持人博客列表
  17. Python小技术-----三维画图
  18. 精品分享:基于 SpringBoot + Vue 开发的云盘系统(含大文件断点续传剖析)
  19. 根号2计算机代码,根号 2 的程序计算方法
  20. velocity模板技术生成word文档

热门文章

  1. ios输入框被软键盘遮住问题
  2. Springboot中自动转JSON输出
  3. Python GUI 设计(一)———Tkinter窗口创建、组件布局
  4. mac视频太大怎么压缩 苹果电脑怎么压缩视频大小的软件
  5. 220805我文明的体现在书法艺术上此对标志LOGO设计产生的积极深远影响分析
  6. 一些 金融知识 小结
  7. fullPage学习
  8. 回头看一看我的2017年
  9. k8s集群灾难恢复-原机器能起来
  10. MySQL关系一对多一对一多对多