当前位置: 首页 > news >正文

高斯核2D热力图heatmap-gauss

heatmap-gauss

一个无渲染逻辑、跨环境兼容的高斯核2D热力图计算库,基于TypeScript开发,专注于热力图核心数据的生成与处理,支持浏览器和Node.js双环境,将渲染控制权完全交给使用者,灵活适配各类可视化场景。

🌟 核心特性

  • 无渲染依赖:仅提供热力图数据计算能力,不绑定任何渲染引擎(如Canvas、SVG),用户可自定义渲染逻辑。
  • 双环境兼容:纯TypeScript实现,不依赖浏览器或Node.js特定API,无缝运行于浏览器和Node.js环境。
  • 高斯核精确计算:基于标准高斯函数(G(d)=e−d22σ2G(d) = e^{-\frac{d^2}{2\sigma^2}}G(d)=e2σ2d2)计算点的影响范围,热力过渡平滑自然。
  • 高效性能优化:采用「3σ原则」限制计算范围(覆盖高斯分布99.7%的能量),平衡计算精度与性能。
  • 灵活数据输出:支持两种核心数据格式(网格数据/归一化点数据),适配不同渲染需求。
  • 完整类型支持:内置TypeScript类型定义,提供清晰的类型提示,提升开发体验。

📦 安装

通过npm或yarn安装:

# npm
npm install heatmap-gauss --save# yarn
yarn add heatmap-gauss

🚀 快速开始

以下示例分别展示在浏览器Node.js环境中的基础用法。

1. 浏览器环境示例

import { GaussianHeatmap } from 'heatmap-gauss';// 1. 创建热力图计算实例
const heatmap = new GaussianHeatmap({width: 800,    // 热力图宽度(单位:像素)height: 600,   // 热力图高度(单位:像素)cellSize: 5,   // 网格单元格大小(单位:像素,越小精度越高)sigma: 25,     // 高斯核标准差(控制扩散范围,越大扩散越广)maxValue: 10   // 可选,强度最大值(用于归一化,不指定则自动计算)
});// 2. 添加数据点(x/y为坐标,value为强度值)
heatmap.addPoints([{ x: 150, y: 200, value: 6 },{ x: 300, y: 400, value: 9 },{ x: 600, y: 300, value: 7 },{ x: 450, y: 500, value: 5 }
]);// 3. 获取计算结果(二选一,根据渲染需求)
// 方式1:获取网格数据(适合批量渲染,如Canvas像素填充)
const gridData = heatmap.getGridData();
console.log('网格数据:', gridData);// 方式2:获取归一化点数据(适合逐个点渲染,如SVG圆)
const normalizedPoints = heatmap.getNormalizedDataPoints();
console.log('归一化点数据:', normalizedPoints);// 4. 自定义渲染(示例:浏览器中用Canvas渲染网格数据)
const canvas = document.getElementById('heatmap-canvas');
const ctx = canvas.getContext('2d');
if (ctx) {canvas.width = gridData.width;canvas.height = gridData.height;// 遍历网格,根据强度值填充颜色(自定义颜色映射)for (let row = 0; row < gridData.data.length; row++) {for (let col = 0; col < gridData.data[row].length; col++) {const intensity = gridData.data[row][col] / gridData.maxValue; // 归一化到0-1const color = `rgba(255, ${Math.floor(255 * (1 - intensity))}, 0, ${intensity * 0.8})`;ctx.fillStyle = color;ctx.fillRect(col * gridData.cellSize,row * gridData.cellSize,gridData.cellSize,gridData.cellSize);}}
}

2. Node.js环境示例

const { GaussianHeatmap } = require('heatmap-gauss');
const fs = require('fs').promises;
const path = require('path');// 1. 创建热力图计算实例
const heatmap = new GaussianHeatmap({width: 800,height: 600,cellSize: 5,sigma: 25
});// 2. 生成并添加随机数据点
function generateRandomPoints(count = 100) {const points = [];for (let i = 0; i < count; i++) {points.push({x: Math.random() * 800,    // 随机x坐标(0-800)y: Math.random() * 600,    // 随机y坐标(0-600)value: 1 + Math.random() * 9 // 随机强度(1-10)});}return points;
}
heatmap.addPoints(generateRandomPoints());// 3. 获取网格数据并保存到文件
async function saveHeatmapData() {const gridData = heatmap.getGridData();await fs.writeFile(path.join(__dirname, 'heatmap-data.json'),JSON.stringify(gridData, null, 2),'utf8');console.log('热力图数据已保存到 heatmap-data.json');
}// 执行保存
saveHeatmapData().catch(console.error);// 后续可将数据传递给 node-canvas 等库进行渲染

📚 API 文档

1. 构造函数 GaussianHeatmap(options)

创建热力图计算实例,options 参数如下:

参数名类型默认值说明
widthnumber必传热力图整体宽度(单位:像素)
heightnumber必传热力图整体高度(单位:像素)
cellSizenumber5网格单元格大小(单位:像素),越小精度越高,计算量越大
sigmanumber20高斯核标准差,控制数据点的扩散范围,越大扩散越广,热力越平滑
maxValuenumberundefined强度最大值(用于归一化),不指定则自动计算所有点的最大强度值

2. 实例方法

addPoint(point: HeatPoint): void

添加单个数据点。

  • HeatPoint 类型:{ x: number; y: number; value: number }
    • x/y:点的坐标(需在 [0, width]/[0, height] 范围内)
    • value:点的强度值(正数,值越大热力越显著)

示例:

heatmap.addPoint({ x: 200, y: 300, value: 7 });
addPoints(points: HeatPoint[]): void

批量添加多个数据点。

示例:

heatmap.addPoints([{ x: 100, y: 200, value: 5 },{ x: 300, y: 400, value: 9 }
]);
clear(): void

清空所有数据点和计算结果,重置实例状态。

示例:

heatmap.clear();
getGridData(): GridData

获取网格格式的热力图数据(适合批量渲染)。

  • GridData 类型:
    interface GridData {width: number;          // 热力图宽度(同构造函数参数)height: number;         // 热力图高度(同构造函数参数)cellSize: number;       // 单元格大小(同构造函数参数)sigma: number;          // 高斯核标准差(同构造函数参数)minValue: number;       // 所有单元格的最小强度值maxValue: number;       // 所有单元格的最大强度值data: number[][];       // 二维数组,[row][col] 对应单元格的强度值
    }
    
getNormalizedDataPoints(): NormalizedPoint[]

获取归一化后的点数据(适合逐个点渲染,如粒子效果)。

  • NormalizedPoint 类型:
    interface NormalizedPoint {x: number;              // 点的原始x坐标y: number;              // 点的原始y坐标value: number;          // 点的原始强度值normalizedValue: number;// 归一化后的强度值(0-1,基于 maxValue)radius: number;         // 点的影响半径(基于 sigma,即 3*sigma)
    }
    
setSigma(sigma: number): void

动态修改高斯核标准差(sigma),修改后需重新添加数据点生效。

示例:

heatmap.setSigma(30); // 扩大扩散范围
heatmap.clear();
heatmap.addPoints(/* 重新添加数据 */);
getSigma(): number

获取当前高斯核标准差(sigma)。

📊 数据格式说明

1. 网格数据(GridData

  • 核心是 data 二维数组,每个元素代表对应单元格的强度值。
  • 适合批量渲染场景(如Canvas像素填充、SVG矩形网格)。
  • 渲染时可根据 minValue/maxValue 将强度值归一化到 0-1,再映射到自定义颜色梯度。

2. 归一化点数据(NormalizedPoint

  • 每个数据点包含归一化后的强度和影响半径,适合逐个渲染(如Canvas圆、SVG圆)。
  • radius3*sigma(基于3σ原则),确保覆盖点的主要影响范围。

🎯 适用场景

  1. 自定义渲染需求:需要使用Canvas、SVG、WebGL等不同渲染引擎的场景。
  2. 跨环境计算:在浏览器中预处理数据,或在Node.js中批量生成热力图数据。
  3. 数据可视化预处理:为ECharts、D3.js等可视化库提供高斯核热力图数据。
  4. 高精度热力计算:对热力过渡平滑度要求高的场景(如用户行为分析、物理场模拟)。

文章转载自:

http://bbJzXfFI.xsLbm.cn
http://b9cFbnnq.xsLbm.cn
http://v8oHVdua.xsLbm.cn
http://7CFoWJVx.xsLbm.cn
http://Byhewtm7.xsLbm.cn
http://MmuaB3sl.xsLbm.cn
http://I8ENzgdO.xsLbm.cn
http://xE7AnOkH.xsLbm.cn
http://OieFccWp.xsLbm.cn
http://GEGImwa3.xsLbm.cn
http://XuG7NpwU.xsLbm.cn
http://260UmlCb.xsLbm.cn
http://qTguQGra.xsLbm.cn
http://UYAtqeEv.xsLbm.cn
http://SRb4K2bv.xsLbm.cn
http://5AK6cQ4L.xsLbm.cn
http://vKBm1ugc.xsLbm.cn
http://IAr7GCxC.xsLbm.cn
http://6BFBq47K.xsLbm.cn
http://KBdPXf3t.xsLbm.cn
http://uTUaHjUO.xsLbm.cn
http://foQyWOxa.xsLbm.cn
http://G3ccSS3k.xsLbm.cn
http://sgGb0ytf.xsLbm.cn
http://bGSIHxbN.xsLbm.cn
http://p18IOogS.xsLbm.cn
http://peZ5Mho4.xsLbm.cn
http://fpFDobex.xsLbm.cn
http://9BcihdaI.xsLbm.cn
http://eW1VClZN.xsLbm.cn
http://www.dtcms.com/a/388317.html

相关文章:

  • 【ubuntu24.04】NFS机械硬盘无法挂载成功
  • 虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)
  • 03-Linux用户和权限
  • 本地大模型编程实战(35)使用知识图谱增强RAG(1)知识图谱简介
  • Spring —— 拦截器和异常处理
  • JavaScript逆向Hook技术及常用Hook脚本
  • Part04 算法
  • 硬件 - 立创EDA入门实践 - 从DCDC降压芯片带您从原理图到PCB到打板
  • 安全认证哪家强?CISP和HCIE我选......
  • 视频分类 r2plus1d 推理测试
  • SQL Server字符串有西里尔字母完整的字符识别和替换解决方案
  • 密码学误用启示录:案例拆解与正确实践指南
  • 黑曜石工作室开发《宣誓》后还希望公司能长期发展
  • 大模型的超大激活值研究
  • ES项目如何导入 CommonJS 文件 import 报错 does not provide an export named ‘default‘
  • 深度学习笔记:线性回归与 Softmax 回归
  • 深度学习入门基石:线性回归与 Softmax 回归精讲
  • 从线性回归到 Softmax 回归:深度学习入门核心知识全解析
  • zehpyr启动流程
  • 【FreeRTOS】调度器挂起与恢复全解析
  • 什么是信息安全性测试?如何选择第三方检测机构?
  • SSM框架——Spring、SpingMVC、Mybatis
  • MongoDB+cpolar:跨环境数据库管理的无缝方案
  • Java 泛型详解:从基础到实践
  • Python与GDAL库进行遥感图像处理:一个完整的实战教程
  • 构建AI智能体:三十六、决策树的核心机制(二):抽丝剥茧简化专业术语推理最佳分裂点
  • computeIfAbsent用法讲解
  • freertos代码结构
  • C++底层刨析章节一:STL概述与设计哲学:深入理解C++标准模板库的核心
  • 多态的原理与实现机制