HeatMap(热图)的原理和实现

本文介绍了热图的基本概念及其在不同领域的应用案例,并详细阐述了热图的生成原理,包括设定离散点缓冲区、灰度填充、灰度值叠加及颜色映射等步骤。同时分享了一个使用C#和GDI+实现热图的例子。

先来看两张图:

(1)10年世界杯决赛,冠军西班牙队中门将、后卫、中场及前锋的跑位热图

通过热图,我们可以很清楚的看出四个球员在比赛中跑动位置的差异。

(2)历史地震震源位置的热图

也可以很清楚的看出,哪个地方是地震的高发地区(频率最高)。

HeatMap简介

上面两张就是热图的典型应用,通过热图可以简单地聚合大量数据,并使用一种渐进的色带来优雅地表现,最终效果一般优于离散点的直接显示,可以很直观地展现空间数据的疏密程度或频率高低。但也由于很直观,热图在数据表现的准确性并不能保证。

生成原理

热图已经不是什么新鲜的概念了,很多领域都在使用。例如记录用户在Web页面内鼠标的点击位置,各种空间离散点数据的显示等等。

其生成的原理简单概括为四个步骤:

(1)为离散点设定一个半径,创建一个缓冲区;

(2)对每个离散点的缓冲区,使用渐进的灰度带(完整的灰度带是0~255)从内而外,由浅至深地填充;

(3)由于灰度值可以叠加(值越大颜色越亮,在灰度带中则显得越白。在实际中,可以选择ARGB模型中任一通道作为叠加灰度值),从而对于有缓冲区交叉的区域,可以叠加灰度值,因而缓冲区交叉的越多,灰度值越大,这块区域也就越“热”;

(4)以叠加后的灰度值为索引,从一条有256种颜色的色带中(例如彩虹色)映射颜色,并对图像重新着色,从而实现热点图。

可以通过几张图来展现这个过程:

(1)灰度带和彩虹色带

(2)单热点显示

单热点的显示,至少要确定它的中心灰度值、半径,当然还有xy和色带。中心灰度值默认设为50(太小显示效果不好)。根据半径的大小(一般是25,屏幕坐标),由中心(50)到边界(0)渐进地填充灰度。我使用黑色(任何颜色都可以)的Alpha通道来进行灰度值的累加,填充后中心位置的ARGB值是(50,0,0,0),边界处是(0,0,0,0),这样就能得到上图左边的灰度图了。最后根据灰度值映射色带得到彩虹带中对应位置的颜色。50的灰度值,只能映射到彩虹带的前1/5处,因而上图右边单热点的颜色以蓝色为主,略带青色。

每个单一热点有一个Weight,默认设为1,目前暂时没有用到(ArcGIS Flex的热图实现中,Weight用来在地图缩小时累加多个离散点聚合后中心灰度值的大小。我没去实现地图缩放的功能,但我觉得Weight会有别的用处,现在还没完全考虑好,以后有机会再说)。Weight不是类似通常二维空间数据中的第三维属性数据,热图只能表现离散点空间上的频率,而不能表现其属性在空间上的分布。例如地震震源的热图,并不能表示其震级大小的空间分布,而只能表现地震次数的多少。

(3)多热点叠加显示

叠加显示,点位置及权重是随机给的,半径是指定的。图中有422个点,半径是50。点越密集的的区域,叠加的灰度也就越多,映射后也显得比较“热”。

.Net实现方法

原理其实蛮简单的,但实现起来就要考虑一些比较琐碎的东西(做任何事情都一样的,看似简单,做起来结果处处是坑!)。我是用C#和GDI+实现的,网上也有很多实例代码,常见语言的版本都有,我也从中参考了不少,获益匪浅。

首先设计一个颜色辅助类ColorUtil:

上面是类中的部分代码,主要的三个函数,其中,

(1)GetGrayRamp是获取0~50的单热点的灰度带,该灰度带将用于填充单点的缓冲区;

(2)GetColorInRamp是根据灰度值去色带中映射颜色(表示色带的代码太长了,copy自Esri Flex API的源代码中);

(3)AdjustOpacity调整图片的透明度,使用了颜色矩阵。

另外还有一个是HeatMapMaker类:

其中,

(1)makeGrayMap先生成灰度图,使用了前面生成的灰度带、半径以及渐进画刷;

(2)MakeHeatMap生成热图,在灰度图的基础上,根据灰度去映射色带,并调整透明度,得到最终的热图。

还有一些别的代码,特别是用到了.net 4.5中新的异步功能,可能有所疏漏。话说ms的东西真是简单,有时简单到让人用起来没底气。

我把代码放到了GitHub上(https://github.com/hmfly/HeatMap),欢迎有兴趣的同学fork,或直接戳这里下载。指出错误或继续改进。当然我自己也会继续改进。虽然有点重复造轮子的感觉,而且我自己也并不喜欢造轮子,但我觉得对有兴趣的东西,了解其原理、实现方法,也是蛮有意思的事情。况且哪有这么多创新的东西,真正有创新也是在你充分了解了前人工作的基础上,加上一点点自己的想法,最终体现在一个点上的微创新吧。

下面是测试界面,可以控制点数、半径、透明度及色带:

测试程序也包含在源代码中。

最后,感谢以下链接及链接的主人:

转载于:https://www.cnblogs.com/h2zZhou/p/7478497.html

<think>好的,用户想了解的绘制原理,特别是在IT数据可视化方面的应用。首先,我需要回顾的基本概念,然后结合用户提供的参考资料来组织答案。 首先,是什么?通过颜色编码来展示数据矩阵中的数值大小,常用于显示变量间的相关性或数据分布。用户提到的引用[1]中使用了R的cor()函数计算相关系数矩阵,然后绘制,这说明常用于相关性分析。需要解释数据准备、颜色映射可视化这三个主要步骤。 接下来,数据准备部分。数据需要是矩阵形式,比如相关系数矩阵。引用[1]中的例子使用attitude数据集计算相关系数,这一步很关键,因为原始数据可能需要处理成适合的形式,比如标准化或计算相关系数。 然后是颜色映射。需要说明如何将数值映射到颜色,通常使用渐变颜色,比如红-蓝或绿-黄。引用[2][3]提到R的ggplot2Python的Matplotlib,这些工具中的颜色梯度设置很重要。需要解释连续型离散型颜色映射的区别,以及如何选择适合的颜色方案。 可视化步骤包括使用工具库绘制,比如R中的ggplot2或Python的Seaborn、Matplotlib。引用[4]详细介绍了Python的可视化库,可以提到这些库的具体函数,如seaborn.heatmap(),并说明参数设置,如annot显示数值,调整字体大小等。 还需要结合用户提供的参考资料中的书籍,强调数据可视化的重要性,如引用[2][3]都提到数据可视化帮助理解复杂数据。同时,应用场景部分可以引用[1]中的例子,说明在IT中的具体应用,如分析用户行为、系统日志聚类等。 用户可能还想知道的优化方法,比如颜色选择、聚类分析,这些可以在相关问题回答中提及。此外,确保回答结构清晰,分步骤说明原理,并给出代码示例,如PythonR的代码片段,这样用户能更直观地理解。 最后,生成的相关问题需要涵盖原理、工具比较、优化常见错误,这样用户可以有进一步学习的路径。需要检查所有引用是否正确对应,比如引用[1]是关于R的例子,引用[2]-[4]是关于数据可视化书籍,确保在回答中正确引用这些资料来支持原理应用部分。</think>### 绘制原理 Heatmap)是一种通过颜色编码展示数据矩阵中数值大小的可视化工具,常用于揭示变量间的相关性、数据分布或聚类结果。其核心原理可分为以下步骤: 1. **数据准备** 输入通常为二维矩阵,例如: - 相关系数矩阵(如引用[1]中 `cor(attitude)` 生成的矩阵) - 基因表达量矩阵(生物信息学) - 用户行为统计矩阵(IT系统日志分析) 数据需经过标准化(如Z-score)或归一化处理,确保数值范围一致。 2. **颜色映射** 将数值映射到颜色空间,常见方式包括: - **连续型渐变**:如红-蓝渐变(高值红色,低值蓝色) - **离散型分段**:将数值区间划分为有限颜色块 数学表示为: $$ \text{Color}(x) = \begin{cases} \text{Red} & \text{if } x \geq \theta_1 \\ \text{Yellow} & \text{if } \theta_2 \leq x < \theta_1 \\ \text{Green} & \text{if } x < \theta_2 \end{cases} $$ 其中 $\theta_1, \theta_2$ 为阈值。 3. **可视化实现** 使用编程工具绘制,常见方法: - **R语言**:通过 `ggplot2` 或 `pheatmap` 包,如引用[1]中的示例 ```r heatmap(Ca, col=colorRampPalette(c("blue","white","red"))(100)) ``` - **Python**:使用 `seaborn.heatmap()` 或 `matplotlib` ```python import seaborn as sns sns.heatmap(data, cmap="viridis", annot=True) ``` --- ### 在IT与数据可视化中的应用 - **相关性分析**:如服务器性能指标间的关联性[^1] - **聚类结果展示**:通过行列聚类揭示数据模式(如用户行为分组) - **异常检测**:颜色突变区域指示系统日志中的异常事件 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值