0.前言
热力图是一种重要的数据可视化方式,可以直观地展现空间数据的疏密程度或频率高低。本文将使用QPainter+QImage来实现热力图绘制,效果参照百度ECharts图表库:
《从前慢》 --------木心
记得早先少年时
大家诚诚恳恳
说一句 是一句
清早上火车站
长街黑暗无行人
卖豆浆的小店冒着热气
从前的日色变得慢
车,马,邮件都慢
一生只够爱一个人
从前的锁也好看
钥匙精美有样子
你锁了 人家就懂了
目录
1.实现思路
2.实现细节
3.代码链接
4.参考
1.实现思路主要步骤如下:
a.每个单独的点为径向渐变色的圆,且透明度从中心到边缘逐渐降低 QRadialGradient gradient(posX,posY,radius); //径向渐变
gradient.setColorAt(0,QColor(0,0,0,alpha)); //点的透明度
gradient.setColorAt(1,QColor(0,0,0,0));
painter.setBrush(gradient);
painter.drawEllipse(QPointF(posX,posY),radius,radius);
b.多个点组合时,透明度是互相叠加的,所以我们先用透明度绘制一个Image(透明度就表示热度)
//透明度用Format_Alpha8就行了
_dataImg=QImage(ImgWidth,ImgHeight,QImage::Format_Alpha8);
_dataImg.fill(Qt::transparent);
//接下来追加绘制圆点
c.如果一个点出现多次,那么就需要有权重的概念,可以根据重复最多的点来作为计算的标准,也可以根据重复次数分段
//权重统计表(把权重单独拿出来,就可以不用遍历数据点来计算了)
//加()初始化为0
int *_countTable=new int[ImgWidth*ImgHeight]();
//以最大次数来计算该点的权重
const uchar alpha=uchar(_countTable[posX+posY*ImgWidth]/(double)_maxCount*255);
d.透明度的图绘制完成后就可以填充颜色,颜色根据透明度从计算好的颜色表中查表获得
void MainWindow::drawHeatImg()
{
//把alpha值转为颜色值
for(int row=0;row
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?