系列文章目录

提示:这里是该系列文章的所有文章的目录
第一章: (一)QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现
第二章: (二)QCustomPlot生成热力图/矩阵颜色图
第三章: (三)Qt+QCustomPlot生成上下方向/不同颜色的条形图(柱形图)
第四章 :(四)QCustomPlot柱形图动态显示实例开发


文章目录

  • 系列文章目录
  • 前言
  • 一、模拟数据生成静态热力图
  • 二、改变Z值生成动态效果
  • 三、基于前文增加的代码总结/下载链接
  • 总结

前言

本文主要讲述了使用QCustomPlot图形库实现热力图的方法,这里的热力图也叫颜色图,本文实现了一个10x10矩阵的热力图,具体实现方式查看代码。文中实例是在上一篇文章实例基础上进行修改的,所以文中放置主要代码,需要完整代码可通过文末百度网盘链接进行下载。

项目效果


提示:以下是本篇文章正文内容,下面案例可供参考

一、模拟数据生成静态热力图

1.创建QCPColorMap热力图及QCPColorScale色条

void MainWindow::setupHeatMap(QCustomPlot *customPlot)
{//x轴设置QSharedPointer<QCPAxisTickerFixed> intTicker_X(new QCPAxisTickerFixed);intTicker_X->setTickStep(1);                                      //设置刻度之间的步长为1intTicker_X->setScaleStrategy(QCPAxisTickerFixed::ssMultiples);   //设置缩放策略customPlot->xAxis->setTicker(intTicker_X);                        //应用自定义整形ticker,防止使用放大功能时出现相同的x刻度值customPlot->xAxis->ticker()->setTickCount(11);                    //刻度数量customPlot->xAxis->setNumberFormat("f");                          //x轴刻度值格式customPlot->xAxis->setNumberPrecision(0);                         //刻度值精度//customPlot->xAxis->setLabel("X轴");                             //设置标签customPlot->xAxis->setLabelFont(QFont(font().family(),8));        //设置标签字体大小customPlot->xAxis->setRange(0,10,Qt::AlignLeft);                  //设置x轴范围customPlot->xAxis->setSubTicks(false);                            //设置子刻度隐藏//customPlot->xAxis->setSubTickLength(2,0);                       //子刻度长度customPlot->xAxis->setTickLength(5,0);                            //主刻度长度customPlot->xAxis->grid()->setPen(QPen(Qt::black));               //设置主刻度线网格线显示,设置为Qt::NoPen就不会显示customPlot->xAxis->grid()->setSubGridVisible(false);              //设置子刻度网格线是否可见//y轴设置QSharedPointer<QCPAxisTickerFixed> intTicker_Y(new QCPAxisTickerFixed);intTicker_Y->setTickStep(1);intTicker_Y->setScaleStrategy(QCPAxisTickerFixed::ssMultiples);customPlot->yAxis->setTicker(intTicker_Y);customPlot->yAxis->ticker()->setTickCount(11);customPlot->yAxis->setNumberFormat("f");customPlot->yAxis->setNumberPrecision(0);//customPlot->yAxis->setLabel("Y轴");customPlot->yAxis->setLabelFont(QFont(font().family(),8));customPlot->yAxis->setRange(0,10,Qt::AlignLeft);customPlot->yAxis->setSubTicks(false);//customPlot->yAxis->setSubTickLength(2,0);customPlot->yAxis->setTickLength(5,0);customPlot->yAxis->grid()->setPen(QPen(Qt::black));customPlot->yAxis->grid()->setSubGridVisible(false);//模拟数据:{行,列,值}QVector<QVector<double>> data ={{0,0,5},{0,1,1},{0,2,9},{0,3,0},{0,4,2},{0,5,0},{0,6,0},{0,7,0},{0,8,0},{0,9,9},{1,0,7},{1,1,0},{1,2,0},{1,3,2},{1,4,0},{1,5,0},{1,6,1},{1,7,1},{1,8,3},{1,9,0},{2,0,1},{2,1,1},{2,2,0},{2,3,0},{2,4,3},{2,5,0},{2,6,0},{2,7,0},{2,8,0},{2,9,7},{3,0,7},{3,1,3},{3,2,9},{3,3,7},{3,4,0},{3,5,0},{3,6,6},{3,7,5},{3,8,1},{3,9,0},{4,0,0},{4,1,3},{4,2,0},{4,3,0},{4,4,2},{4,5,1},{4,6,0},{4,7,0},{4,8,0},{4,9,2},{5,0,2},{5,1,1},{5,2,7},{5,3,3},{5,4,0},{5,5,0},{5,6,9},{5,7,7},{5,8,2},{5,9,0},{6,0,1},{6,1,0},{6,2,0},{6,3,0},{6,4,3},{6,5,0},{6,6,0},{6,7,0},{6,8,0},{6,9,6},{7,0,1},{7,1,0},{7,2,3},{7,3,8},{7,4,0},{7,5,0},{7,6,7},{7,7,8},{7,8,0},{7,9,0},{8,0,1},{8,1,0},{8,2,6},{8,3,0},{8,4,5},{8,5,0},{8,6,0},{8,7,0},{8,8,1},{8,9,2},{9,0,1},{9,1,0},{9,2,3},{9,3,0},{9,4,0},{9,5,0},{9,6,0},{9,7,8},{9,8,0},{9,9,9},};QCPColorMap *heatmap = new QCPColorMap(customPlot->xAxis,customPlot->yAxis);   //构造一个颜色图heatmap->data()->setSize(10,10);   //设置颜色图数据维度,代表你的数据矩阵(10x10),这里可以理解为有多少个小方块heatmap->data()->setRange(QCPRange(0.5,9.5), QCPRange(0.5,9.5));   //颜色图在x、y轴上的范围,这里可以查看下setRange函数定义for(int x=0;x<10;x++){for(int y=0;y<10;y++){int z = data.at(10 * y + x).at(2);if(z){heatmap->data()->setCell(x, y, z);    //如果z不为0,则设置颜色值的位置}else{heatmap->data()->setAlpha(x, y, 0);   //z为0,设置为透明,根据需求来设置}}}QCPColorScale *colorScale = new QCPColorScale(customPlot);   //构造一个色条colorScale->setType(QCPAxis::atBottom);                      //水平显示customPlot->plotLayout()->addElement(1, 0, colorScale);      //在颜色图下面显示heatmap->setColorScale(colorScale);                          //设置色条QCPColorGradient gradient;                                   //色条使用的颜色渐变gradient.setColorStopAt(0.0, QColor("#54ff9f"));             //设置渐变在指定位置的颜色(从0到1),最小为0.0gradient.setColorStopAt(0.5, QColor("#f6efa6"));             //设置色条分段的颜色gradient.setColorStopAt(1.0, QColor("#cd2626"));             //设置色条结束时的颜色,最大为1.0heatmap->setGradient(gradient);                              //设置颜色渐变//heatmap->rescaleDataRange();                               //自动计算数据范围,数据范围决定了哪些数据值映射到QCPColorGradient的颜色渐变当中heatmap->setDataRange(QCPRange(0, 10));                      //设置数据范围heatmap->setInterpolate(false);                              //禁用插值,界面显示小方块//保持色条与轴矩形边距一致QCPMarginGroup *marginGroup = new QCPMarginGroup(customPlot);customPlot->axisRect()->setMarginGroup(QCP::msLeft | QCP::msRight, marginGroup);colorScale->setMarginGroup(QCP::msLeft | QCP::msRight, marginGroup);//刷新界面customPlot->replot(QCustomPlot::rpQueuedReplot);
}

二、改变Z值生成动态效果

1.定时器内随机改变Z值

//热力图刷新定时器
void MainWindow::slot_mapTimeOut()
{auto *colorMap = static_cast<QCPColorMap *>(cusHeatMap->plottable(0));int keySize = colorMap->data()->keySize();int valueSize = colorMap->data()->valueSize();for(int x=0;x<keySize;x++){for (int y=0;y<valueSize;y++){//if(colorMap->data()->alpha(x,y))   //判断当前是否透明//{//如果之前有设置透明,依然会透明colorMap->data()->setCell(x,y, QRandomGenerator::global()->bounded(0,10));   //0-10直接随机值,可查看bounded定义//}}}cusHeatMap->replot(QCustomPlot::rpQueuedReplot);   //括号内参数作用是避免重复绘制
}

三、基于前文增加的代码总结/下载链接

1.mainwindow.h

class MainWindow : public QMainWindow
{Q_OBJECTpublic:...void InitHeatMap();void setupHeatMap(QCustomPlot *customplot);private slots:...void slot_mapTimeOut();void on_action_heatMap_triggered();void on_action_heatMap_2_triggered();private:...//热力图QCustomPlot *cusHeatMap;QTimer *mapTimer;}

2.mainwindow.cpp

//构造函数中添加InitHeatMap();
void MainWindow::InitHeatMap()
{cusHeatMap = new QCustomPlot();cusHeatMap = ui->widget_color;//热力图刷新定时器mapTimer = new QTimer();connect(mapTimer,SIGNAL(timeout()),this,SLOT(slot_mapTimeOut()));
}void MainWindow::setupHeatMap(QCustomPlot *customPlot)
{//该函数内容见前文...
}void MainWindow::slot_mapTimeOut()
{//该函数内容见前文...
}void MainWindow::on_action_heatMap_triggered()
{setupHeatMap(cusHeatMap);
}void MainWindow::on_action_heatMap_2_triggered()
{mapTimer->start(1000);   //开启定时器实现动态热力图效果
}

3.mainwindow.ui

4.完整代码百度网盘链接
https://pan.baidu.com/s/1aIvEe6pMI15M9K2H0FWRJQ
提取码:xxcj


总结

本文示例使用QCustomPlot绘制热力图的时候,可以发现所用的数据格式为{x,y,z},其中了x、y两个位置可以看作矩阵的x行y列,还有一个z数值,z数值对应着色条中渐变的颜色取值,需要注意的是渐变在指定位置的颜色是有范围的(0-1),可以使用heatmap->data()->setAlpha(x,y,z)将指定位置数据设为透明。

本系列文章下一篇:(三)Qt+QCustomPlot生成上下方向/不同颜色的条形图(柱形图)


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考博客:QCustomPlot之热力图(十四)

(二)QCustomPlot生成热力图/矩阵颜色图相关推荐

  1. Matlab渐变颜色图(colormap)生成/编辑器—ColorMap

    渐变配色在科研绘图时十分常用. 比如三维柱状图: 特征渲染散点图: 热图: 等等,都需要使用渐变配色. 作为一个Matlab用户,你大概听说过jet.parula.hsv.hot这些耳熟能详的颜色图( ...

  2. xyz坐标图_“色觉地图”的建立(二):辐照度与亮度、rgb空间、“颜色图”的混色方式...

    上篇""色觉地图"的建立(一):光感受器.色匹配实验与CIE RGB坐标系"中说到,人的色觉是线性的,我们可以用叠加原理"混色"--这意味着 ...

  3. MATLAB颜色图中,小于某个值的所有点设为白色

    文章目录 1.问题提出 2.MATLAB工程图形处理方式 3.什么是colormap 4.什么是CData 5.Scaled方式 6.pcolor函数不能胜任 7.patch登场 1.问题提出 如图1 ...

  4. Matlab 散点图(Scatter)和颜色图(Colormap)

    目录 一.什么是散点图? 二.什么数据需要用散点图来呈现? 三.matlab 中的颜色如何表示和调用? 四.颜色和透明度在散点图中的灵活应用 二维散点图 三维散点图 数据分组! 五.Scatter 的 ...

  5. 数学建模番外篇6:二维/三维热力图绘制(matlab)

    效果 虽然PPT可以绘制大多数的图像,但对于这类图像绘制,用PPT则会有些吃力,而在matlab中则能够比较方便的解决, 源码 先放源码,后面分析. [x,y] = meshgrid(1:0.1:10 ...

  6. python画图标题为蓝色_请问使用matplotlib和绘图色标创建自己的颜色图

    由于在其他答案中使用的方法对于如此简单的任务来说似乎相当复杂,下面是一个新的答案: 而不是ListedColormap,它生成一个离散的颜色图,您可以使用LinearSegmentedColormap ...

  7. numpy的生成网格矩阵 meshgrid()

    numpy模块中的meshgrid函数用来生成网格矩阵,最简单的网格矩阵为二维矩阵 meshgrid函数可以接受 x1, x2,..., xn 等 n 个一维向量,生成 N-D 矩阵. 1 基本语法 ...

  8. ROS系统MoveIt玩转双臂机器人系列(二)--生成MoveIt配置包

    ROS系统MoveIt玩转双臂机器人系列(二)--生成MoveIt配置包 注:本篇博文全部源码下载地址为:Git Repo. 1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译. ...

  9. python 生成空白矩阵_3个用于数据科学的顶级Python库

    用这些库把Python变成一个科学数据分析和建模工具. image by Opensource.com Python许多吸引人的特点如效率.代码可读性和速度使它成为数据科学爱好者的首选编程语言.对于希 ...

最新文章

  1. Mysql数据库常用操作整理
  2. 2011阿里巴巴集团实习生招聘笔试题 CC++
  3. echarts柱状图显示百分比_Echarts 饼状图显示信息,内容,值,百分比都显示的代码 更改图例等问题汇总...
  4. carsim的学习笔记2——test specifications
  5. 【Linux网络编程】端口绑定问题
  6. HDU Problem - 5918 Sequence I
  7. laravel中migrate的使用
  8. android imageview 设置网络图片,ImageView加载网络图片
  9. Linux Shell脚本入门教程系列之(六)Shell数组
  10. 开源代码准确率99%+,人脸识别问题真的被解决了吗?
  11. 腾讯阿里达成“共识”!马化腾称“用链量”“用云量”或成数字时代的重要指标...
  12. p6 软件 服务器没有项目了,前后端分离项目一台服务器上线
  13. python入门神器 知乎_如何处理 Python 入门难以进步的现象?
  14. 21. Don't try to return a reference when you must return an object
  15. vue选项卡切换,某个组件缓存数据keep-alive demo
  16. ExtJS视频教程1(上)
  17. 精品LowPoly低多边形风格模型插件资源包合集(随时更新)
  18. 服务器端配置jupyter notebook以及本地打不开的解决办
  19. Copyright中的年份是什么意思
  20. ubuntu 系统监控工具

热门文章

  1. DIP数字图像处理笔记
  2. 项目管理相关认证简要介绍(2)- PMP
  3. 原创:拆机联想Y330笔记本
  4. 再见,itchat!再见,网页版微信!
  5. 以单片机为核心,设计一个节日彩灯控制器
  6. NOKIA5110液晶显示模块学习笔记
  7. 【IBM MQ】AMQ6126问题解决思路
  8. ZPL II 语言编程基础
  9. 加载的图片太多或太大如何优化
  10. y空间兑换代码_动态空间面板模型教程(一文读懂动态面板空间spregdpd操作应用)...