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

Highcharts图表实战案例|开发每秒更新的曲线图

实战案例:

创建一个实时动态刷新的平滑折线图效果:每秒自动新增一个数据点,自动滚动、自动丢弃旧数据,永远保持最新 20 个点

核心功能

每秒自动刷新一次带脉冲扩散动画(新增点时扩散圆圈)时间轴自动滚动本地时间显示鼠标悬浮可查看精确时间与数值平滑曲线,美观流畅

THML代码

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>实时动态数据图表 - Highcharts</title> <!-- 引入 Highcharts --> <script src="https://cdn.jsdelivr.net/npm/highcharts@10.3.3/highcharts.js"></script> <style> #container { width: 100%; height: 80vh; margin: 0 auto; } </style> </head> <body> <div id="container"></div> <script> // 图表加载完成后,启动定时器,每秒添加一个新数据点 const onChartLoad = function () { const chart = this, series = chart.series[0]; setInterval(function () { const x = (new Date()).getTime(); // 当前时间 const y = Math.random(); // 随机数值 // 添加新点,自动更新图表 series.addPoint([x, y], true, true); }, 1000); }; // 初始化前20个历史数据 const data = (function () { const data = []; const time = new Date().getTime(); for (let i = -19; i <= 0; i += 1) { data.push({ x: time + i * 1000, y: Math.random() }); } return data; }()); // 插件:新增数据点时显示脉冲扩散动画 Highcharts.addEvent(Highcharts.Series, 'addPoint', e => { const point = e.point; const series = e.target; if (!series.pulse) { series.pulse = series.chart.renderer.circle().add(series.markerGroup); } setTimeout(() => { series.pulse .attr({ x: series.xAxis.toPixels(point.x, true), y: series.yAxis.toPixels(point.y, true), r: series.options.marker.radius, opacity: 1, fill: series.color }) .animate({ r: 20, // 扩散半径 opacity: 0 // 逐渐消失 }, { duration: 1000 }); }, 1); }); // 渲染图表 Highcharts.chart('container', { chart: { type: 'spline', // 平滑折线图 events: { load: onChartLoad // 加载后启动动态刷新 } }, time: { useUTC: false // 使用本地时间 }, // 标题 title: { text: '实时动态随机数据图表' }, // 无障碍新数据提示 accessibility: { announceNewData: { enabled: true } }, // X轴:时间轴 xAxis: { type: 'datetime', title: { text: '时间' }, tickPixelInterval: 150 }, // Y轴 yAxis: { title: { text: '数值' }, plotLines: [ { value: 0, width: 1, color: '#808080' } ] }, // 鼠标悬浮提示框 tooltip: { headerFormat: '<b>{series.name}</b><br/>', pointFormat: '{point.x:%Y-%m-%d %H:%M:%S}<br/>数值:{point.y:.2f}' }, // 隐藏图例、导出按钮 legend: { enabled: false }, exporting: { enabled: false }, // 数据系列 series: [ { name: '随机数据', lineWidth: 2, color: Highcharts.getOptions().colors[2], data: data } ] }); </script> </body> </html>

核心功能说明

(1) 初始化数据

生成最近 20 秒的历史随机数据,让图表打开就有内容。

(2) 定时器刷新

setInterval(..., 1000)每 1 秒生成一个新的随机数 + 当前时间,添加到图表。

(3) 自动滚动

series.addPoint([x,y], true, true)第 3 个参数true=自动移除最早的点,保持长度不变,实现滚动效果

(4) 脉冲动画插件

新增点时,自动画一个扩散并消失的圆形光圈,视觉效果极强,适合监控大屏。

4. 适用场景

  • 实时监控大屏
  • 传感器数据展示
  • 服务器状态监控
  • 随机数据模拟
  • 物联网数据实时展示

✅ 使用方法

  1. 复制全部代码
  2. 新建文件 → 粘贴 → 保存为chart.html
  3. 双击打开即可看到动态图表!
http://www.cnnetsun.cn/news/2706959.html

相关文章:

  • GLIP、CLIP、Grounding DINO傻傻分不清?一张图讲透多模态检测模型怎么选
  • 告别30天试用!保姆级教程:在Windows 10/11上永久激活Quartus II 13.0(附网卡号获取与license.dat配置全流程)
  • 云计算如何赋能城市信息学:从数据处理到智慧决策
  • XZ1852输入电压6-60V,输出电压ADJ(小于59V),输出电流1.5A,单片降压型开关模式转换器
  • 3步快速批量下载网易云音乐歌单FLAC无损音乐的完整指南
  • NASA大气剖面计算器停服后,手把手教你用USGS Landsat Collection 2数据反演地表温度(含ENVI实操)
  • 深度解析Chromatic:广谱注入Chromium/V8的通用修改器架构实现
  • 激活稀疏化技术:提升LLM推理效率的动态剪枝方法
  • 大语言模型如何从对话隐式反馈中自我进化:RESPECT方法解析
  • 别让‘警告’变‘报错’:深度解读KingbaseES的sql_mode,精准控制数据插入的严格度
  • Matlab光谱数据处理工具:支持K-M系数、XYZ、Lab、RGB一键转换与可视化
  • 从滤波到平滑:一个Python实例带你彻底搞懂卡尔曼滤波的‘亲兄弟’——RTS平滑算法
  • STM32CubeIDE新手必看:Debug和Release模式到底怎么选?别再傻傻分不清了
  • Nav2导航时,你的阿克曼小车为什么‘画龙’或原地打转?可能是odom计算埋了坑
  • 手把手教你用dnSpy调试.NET混淆的Office插件(以某格子插件为例)
  • AI大模型微调与架构
  • 数据厨房——从阿明的“10 家店 10 本账“,看数据架构与数据治理的完整旅程
  • 一线安全工程师口述|网安学啥内容?为何选入行?收入怎么样?
  • 从ChatGPT到图灵测试:我们离‘真正’的智能还有多远?聊聊AI的‘模仿游戏’
  • ThinkPad X1 Carbon 指纹识别在 Ubuntu 20.04 上复活记:从‘设备繁忙’报错到完美登录的保姆级排错指南
  • 越野环境语义分割技术:CMSNet框架与优化策略
  • 智能运维实战:从数据平台构建到核心场景落地
  • RabbitMQ详解
  • MATLAB自动泊车强化学习仿真包:含训练好智能体、RRT路径规划与LIDAR/视觉传感器建模
  • 数据压缩与信号计算:硬核创新如何重塑数字基础设施效率
  • Gemma-4-E2B-it音频处理完全攻略:语音识别与理解技术详解
  • 基于Kinect的手势识别与对话分析:从数据采集到模型应用
  • RAVEN系统:基于视觉感知的移动游戏动态帧率节能技术解析
  • SAM2-Hiera-Large与Transformers集成指南:轻松构建企业级分割应用
  • Kinect for Windows SDK Beta Refresh:体感开发核心工具更新与实战指南