因为项目需要用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. gridview格式化日期字段
  2. 如何去除本地文件与svn服务器的关联
  3. linux 引导程序修复工具,linux 引导修复工具
  4. SmartPart事件
  5. c mysql使用场景_Mysql 场景
  6. 博弈——Nim博弈(hdu2176,1850,1851,1907,1849)
  7. HR谈网络工程师求职与职业规划
  8. 数组求和forEach方法
  9. 是时候让打字更“快舒”了-小鹤双拼
  10. ADA本月上涨100%,背后或有三个原因
  11. D - Sleepy Game
  12. uniapp小程序中长按识别公众号二维码,企业微信二维码,个人微信二维码
  13. Spark中Map和Json字符串相互转换
  14. 关闭微信小程序电脑端的位置定位
  15. i9 13900ks和13900k区别 i913900ks和i913900k对比
  16. How to manage the changes in Netlogon secure channel connections associated with CVE-2020-1472
  17. 首批 RISC-V 手机要来了,你准备好了吗?
  18. 微软儿童编程技术,kodu(酷豆)为儿童创造一个游戏世界
  19. Git 打patch (打补丁)的使用
  20. 【Python3.6爬虫学习记录】(十五)Scrapy爬虫框架的应用及马赛克拼图生成

热门文章

  1. 2022年上海办理EDI增值电信经营许可证年检有哪些政策
  2. json解析教程(1)程序员不得不掌握的数据格式json
  3. logback配置信息详解
  4. 根据父母身高预测儿子的身高
  5. Excel 解决高次方程求解的方法
  6. Long memory is important: A test study on deep-learning based car-following model
  7. photoshop-photoshop记录
  8. python描述对象静态特性的数据为_短期借款利息数额不大,可以直接支付,不预提,在实际支付时直接记入的账户是( )。...
  9. strpos使用不当引发漏洞
  10. v2021年烷基化工艺考试题及烷基化工艺考试试卷