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

左右双向堆叠箭头条形图:Highcharts 自定义箭头柱状插件示列代码

本案例是依托 Highcharts 开放的事件钩子与自定义矢量路径能力,可低成本开发异形柱状插件,无需底层图形渲染开发,解决原生条形样式单一、无法直观表达 “双向作用力” 的可视化痛点。

Highcharts原生兼容堆叠、正负色、数据标签、无障碍全套能力,自定义箭头条形直观区分正负向指标,代码轻量易复用,适配科研、工业、财务双向差值可视化场景。

完整可预览 HTML代码

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>自定义箭头堆叠条形图 - 火星EDL动力对比</title> <!-- 标准官方CDN依赖 --> <script src="https://code.highcharts.com/highcharts.js"></script> <script src="https://code.highcharts.com/modules/accessibility.js"></script> <style> .highcharts-figure { width: 100%; margin: 20px auto; } #container { width: 100%; height: 170px; } </style> </head> <body> <figure class="highcharts-figure"> <div id="container"></div> </figure> <script> /** * Highcharts 自定义插件:实现两端带箭头异形柱状/条形 */ (function (H) { H.addEvent( H.seriesTypes.column, 'afterColumnTranslate', function () { const series = this, options = series.options, topMargin = options.topMargin || 0, bottomMargin = options.bottomMargin || 0, idx = series.index; if (options.headSize) { series.points.forEach(function (point) { const shapeArgs = point.shapeArgs, w = shapeArgs.width, h = shapeArgs.height, x = shapeArgs.x, y = shapeArgs.y, cutLeft = idx !== 0, cutRight = point.stackY !== point.y || !cutLeft; let len = options.headSize; // 箭头像素长度 if (point.y < 0) { len *= -1; } // 保留原始矩形用于数据标签定位 point.dlBox = point.shapeArgs; // 自定义矢量路径,绘制两端箭头异形条形 point.shapeType = 'path'; point.shapeArgs = { d: [ ['M', x, y + topMargin], ['L', x + w / 2, y + topMargin + (cutRight ? len : 0)], ['L', x + w, y + topMargin], ['L', x + w, y + h], ['L', x + w / 2, y + h + bottomMargin + (cutLeft ? len : 0)], ['L', x, y + h + bottomMargin], ['L', x, y], ['Z'] ] }; }); } } ); }(Highcharts)); // 图表渲染 Highcharts.chart('container', { chart: { type: 'bar', height: 170 }, title: { text: '火星进入下降着陆阶段作用力对比' }, plotOptions: { bar: { headSize: 6, // 自定义箭头尺寸,插件专用配置项 stacking: 'normal', // 普通堆叠 dataLabels: { enabled: true, y: 20, verticalAlign: 'bottom', color: '#000' }, color: 'rgb(255, 7, 77)', // 正向力红色 negativeColor: 'rgb(1, 127, 250)', // 负向阻力蓝色 accessibility: { exposeAsGroupOnly: true } } }, tooltip: { format: '<span style="color:{point.color}">●</span> <b>{series.name}: {point.y}</b>' }, accessibility: { typeDescription: '堆叠条形受力图表,正向加速力向右展示,负向减速阻力向左展示', series: { descriptionFormat: '第{add series.index 1}组系列,名称:{series.name},{#if (gt series.points.0.y 0)}加速力{else}减速阻力{/if},数值:{series.points.0.y}' } }, yAxis: { reversedStacks: false, opposite: true, labels: { enabled: false }, title: '', stackLabels: { enabled: true, verticalAlign: 'top', style: { fontSize: '1.2em' }, format: '{#if isNegative}最小值{else}最大值{/if}:{total}' }, startOnTick: false, endOnTick: false }, xAxis: { visible: false, title: '' }, legend: { enabled: false }, series: [ // 正向叠加加速力 { name: '初始进入速度推力', data: [15] }, { name: '火星重力', data: [3] }, // 负向减速阻力 { name: '再入大气阻力', data: [-9] }, { name: '降落伞阻力', data: [-7] }, { name: '隔热罩分离阻力', data: [-0.5] }, { name: '反推火箭减速', data: [-1.5] }, { name: '天空起重机缓冲力', data: [-1] } ] }); </script> </body> </html>

图表类型解析

1. 图表类型

自定义插件异形堆叠水平条形图(bar)基于原生 column 系列扩展自定义 path 矢量路径插件,实现条形两端箭头造型;支持正负双向堆叠,正向红色向右、负向蓝色向左,适用于作用力、收支、正负差值对比场景。

2. 自定义插件核心原理

  1. 监听afterColumnTranslate渲染完成钩子,拦截每个柱子绘制逻辑;
  2. 通过headSize自定义箭头伸出长度,区分首条 / 末条堆叠块单侧显示箭头;
  3. 放弃默认矩形渲染,改用 SVG path 路径绘制带箭头的异形封闭图形;
  4. 保留原始矩形dlBox保证数据标签位置不偏移。

3. 关键业务配置拆解

  1. 双向堆叠区分正负negativeColor单独配置负值条形颜色,直观区分推力 / 阻力、收入 / 支出;
  2. 堆叠总量标签stackLabels展示左右两侧堆叠总和,标注最大 / 最小累计值;
  3. 极简坐标轴 X 轴完全隐藏,仅保留数值堆叠图形,画面干净适合仪表盘、简报;
  4. 无障碍完整适配 内置系列朗读描述,区分加速 / 减速两类力,满足科研、政务可视化无障碍规范;
  5. 统一箭头尺寸控制plotOptions.bar.headSize:6全局统一箭头大小,按需调整粗细视觉效果。

插件核心可调整参数

  1. headSize:箭头伸出像素长度,数值越大箭头越突出;
  2. topMargin / bottomMargin:条形上下留白间距;
  3. cutLeft/cutRight逻辑:自动判断堆叠首尾块,仅外侧一端渲染箭头,中间堆叠块无箭头,视觉连贯;
  4. negativeColor:负值条形专属配色,区分正负维度数据。

适用行业场景

  1. 航空航天、飞行器力学受力分析图表
  2. 财务收支双向对比堆叠图(收入正向、支出负向)
  3. 设备能耗、动力、压力正负差值监控看板
  4. 项目盈亏、流量增减双向对比简报
  5. 科研论文、技术报告自定义异形可视化图表
http://www.cnnetsun.cn/news/3156553.html

相关文章:

  • 天赐范式第93天:TDP-CP——计算路径的六步推演与1/137追问的终极重定向
  • Codex实战指南:从零掌握AI编程助手,提升开发效率
  • Linux系统中的用户和组管理
  • 告别复杂环境配置,OpenClaw 多平台一键部署实操全流程(含安装包)
  • 【AI大模型进阶】参数入门:temperature等核心参数作用详解
  • 大疆发布 Mic Mini 2S:新增存储与多麦连接能力,售价 629 元
  • AI 无人直播软件横向测评:2026 主流产品功能、成本、适配维度对照
  • 2026年干细胞机构观察:四家企业技术布局与服务边界梳理
  • 易信easyMarkets观察:服务响应、风控提示和使用秩序的综合参考
  • Fable 5“抓狂发言”引热议:大模型“私有语言”是隐患还是萌点?
  • 百考通AI帮你把通过检测系统
  • Anthropic与OpenAI芯片争霸:谁能在AI芯片领域成为武林盟主?
  • 我们在焦虑什么
  • AI算力调度新方案:动态评分机制解析与工程实践
  • 百考通AI高质量开题报告开启智慧新篇章
  • 硅基流动递表港交所冲击“Token工厂第一股”:高估值背后是AI水电煤还是资本泡沫?
  • 从零实战京东JoyAI-VL-Interaction:构建实时视频交互AI助手
  • 为什么有些人学什么都很快?
  • 安卓修改大师:Receiver属性详解与屏幕亮灭监听实战
  • 计算机视觉会议/期刊缩写速查:CVPR/ECCV/TPAMI 等 50+ 项 BibTeX 格式一键生成
  • 同城跑腿行业痛点与数字化解决方案探讨
  • 集人脸、刷卡、掌静脉、密码多模态于一体的嵌入式智能门禁梯控
  • 使用langgraph的意义是什么
  • 基于32维Cayley_Dickson超复数的全域拓扑统一场论——反重力、真空自持供能、维度瞬移与星际宇宙脑秩序体系
  • 通信与接口协议面试二、UART
  • 未来已来:KubeHawk的 roadmap 与云原生监控趋势
  • 告别白嫖困扰,让软件真正变现——乾坤云网络验证,一键守护你的劳动成果
  • api-guarder项目详解:从安装到使用的完整教程
  • KPL-gmssl性能测试报告:鲲鹏芯片加密速度提升300%的秘密
  • Wireshark网络流量分析实战:从TCP故障排查到安全威胁识别