拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Chart.js 雷达图跳过数据点(Radar Skip Points)完整实现指南

Chart.js 雷达图跳过数据点Radar Skip Points完整实现指南【免费下载链接】Chart.jsSimple HTML5 Charts using thetag项目地址: https://gitcode.com/gh_mirrors/ch/Chart.js雷达图Radar Chart中数据数组里某个索引的值若为nullChart.js 会跳过该数据点对应的数据点不被绘制连线在此处断开形成缺口。本文基于 Chart.js 官方示例 docs/samples/other-charts/radar-skip-points.md完整还原跳过首点、跳过中间点、跳过末点三种情形的实现代码并结合源码剖析null值在雷达图内部从数据解析、坐标计算到渲染断线的完整链路帮助你在实际项目中自如控制雷达图的数据缺口。核心思路用null标记被跳过的数据点雷达图的data属性是一个数值数组每个值对应一个标签label位置。将数组中某一项设为nullChart.js 便不再为该索引绘制数据点也不会把该点与相邻点连接。这一点在雷达图数据结构的官方定义中同样成立数据是与 labels 同索引对应的数值数组见 docs/charts/radar.md而null即表示此处无数据。一个典型场景是数据采集不完整、某一时刻缺少读数或者希望刻意制造图表断点来区分数据区间。相比删除数组元素会导致标签错位用null占位能够保持标签索引与数据一一对应是最稳妥的做法。完整示例同时跳过首、中、尾三个数据点下面的代码来自官方示例创建了一个雷达图包含三个数据集第一个数据集跳过首个数据点第二个数据集跳过中间数据点第三个数据集跳过最后一个数据点并分别使用红、蓝、绿三种颜色加以区分const DATA_COUNT 7; const NUMBER_CFG {count: DATA_COUNT, min: 0, max: 100}; const labels Utils.months({count: 7}); const dataFirstSkip Utils.numbers(NUMBER_CFG); const dataMiddleSkip Utils.numbers(NUMBER_CFG); const dataLastSkip Utils.numbers(NUMBER_CFG); dataFirstSkip[0] null; dataMiddleSkip[Number.parseInt(dataMiddleSkip.length / 2, 10)] null; dataLastSkip[dataLastSkip.length - 1] null; const data { labels: labels, datasets: [ { label: Skip first dataset, data: dataFirstSkip, borderColor: Utils.CHART_COLORS.red, backgroundColor: Utils.transparentize(Utils.CHART_COLORS.red, 0.5), }, { label: Skip mid dataset, data: dataMiddleSkip, borderColor: Utils.CHART_COLORS.blue, backgroundColor: Utils.transparentize(Utils.CHART_COLORS.blue, 0.5), }, { label: Skip last dataset, data: dataLastSkip, borderColor: Utils.CHART_COLORS.green, backgroundColor: Utils.transparentize(Utils.CHART_COLORS.green, 0.5), } ] }; const config { type: radar, data: data, options: { responsive: true, plugins: { title: { display: true, text: Chart.js Radar Skip Points Chart } } }, };关键点说明dataFirstSkip[0] null将第一个数据点置空雷达图的多边形在该顶点处出现缺口dataMiddleSkip[Number.parseInt(dataMiddleSkip.length / 2, 10)] nullNumber.parseInt(len / 2, 10)取数组中间索引7 个点时即索引 3跳过中间顶点dataLastSkip[dataLastSkip.length - 1] null跳过最后一个顶点此时原本闭合的雷达多边形会缺少最后一段连接。Utils.months({count: 7})与Utils.numbers(NUMBER_CFG)是官方示例脚本提供的工具函数见 docs/samples/utils.md分别生成月份标签与 0–100 范围内的随机数值Utils.transparentize(color, 0.5)用于将颜色转为半透明以作填充色。通过 action 动态演示跳过效果示例还附带了一个Randomize动作每次触发都会为三个数据集重新生成随机数据并把第一个、中间、最后一个数据点分别置为null随后调用chart.update()刷新图表const actions [ { name: Randomize, handler(chart) { chart.data.datasets.forEach((dataset, i) { const data Utils.numbers({count: chart.data.labels.length, min: 0, max: 100}); if (i 0) { data[0] null; } else if (i 1) { data[Number.parseInt(data.length / 2, 10)] null; } else { data[data.length - 1] null; } dataset.data data; }); chart.update(); } } ];这里展示了一个通用模式chart.data.datasets.forEach(...)直接改写数据集数组之后必须调用chart.update()让改动生效。Randomize这类交互动作在图表编辑器chart-editor中会渲染为可点击按钮便于直观验证数据变化。源码剖析null值在雷达图内部的完整处理链路了解置null即跳过的渲染效果后我们深入源码看它到底是如何实现的。这条链路一共四步1. 数据解析与坐标计算controller scale雷达图的控制器 src/controllers/controller.radar.js 在updateElements中逐点计算坐标const pointPosition scale.getPointPositionForValue(i, this.getParsed(i).r); ... const properties { x, y, angle: pointPosition.angle, skip: isNaN(x) || isNaN(y), options };当某个点的值解析为null时径向线性刻度 src/scales/scale.radialLinear.js 的getDistanceFromCenterForValue会直接返回NaNgetDistanceFromCenterForValue(value) { if (isNullOrUndef(value)) { return NaN; } ... }getPointPositionForValue(index, value)内部调用getPointPosition(index, this.getDistanceFromCenterForValue(value))于是该点的x、y均为NaN最终skip: isNaN(x) || isNaN(y)判定为true——这就是跳过点标志的来源。2. 数据点跳过绘制point element数据点元素 src/elements/element.point.ts 的draw方法首先检查skip标志draw(ctx, area) { const options this.options; if (this.skip || options.radius 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) { return; } ... }一旦skip为真该点直接不参与绘制因此雷达图的顶点处不显示任何圆点。3. 连线断开line element雷达图默认showLine: true见RadarController.defaults连线由线元素 src/elements/element.line.js 负责。在pathSegment中遍历点序列时if (point.skip) { // If there is a skipped point inside a segment, spanGaps must be true continue; }被跳过的点不产生lineTo操作线段在缺口两侧自然断裂视觉上形成跳过的效果。4. 分段与spanGaps行为segment helper当spanGaps为false或未开启时断点会将线段拆分为多个独立段。src/helpers/helpers.segment.js 中的_computeSegments会依据cur.skip || cur.stop计算实线段的范围if (cur.skip || cur.stop) { if (!prev.skip) { ... } ... }如果希望缺口两侧的线连续跨越被跳过的点即忽略null继续连线可以为数据集开启spanGaps: true。该属性的官方语义见 docs/charts/radar.mdspanGaps为true时线会在无数据或null数据的点之间继续绘制为false时null数据点会在线条上制造一个断口。它的默认值为undefined实际行为由段计算逻辑按跳过点处断开处理。实战要点与注意事项保持标签索引对齐跳点时应保留数组长度用null占位切勿用splice删减元素——删除会导致后续数据点与labels错位整个雷达图形状都会改变。跳过位置无限制首点、中间点、末点均可跳过示例同时覆盖了这三种边界情形说明该机制对任意索引都生效多个连续null会形成更大范围的缺口。结合spanGaps控制连线想要断线留白就用默认行为想要跨过缺口连线则设spanGaps: true二者可随需求切换。配色建议示例中每个数据集使用borderColor 半透明backgroundColorUtils.transparentize(color, 0.5)的组合保证多个数据集叠加时轮廓清晰、填充不互相遮挡。雷达图专属设置雷达图仅支持单一径向刻度scales.r默认type: radialLinear、aspectRatio: 1、线元素默认fill: start见 src/controllers/controller.radar.js。刻度相关选项可参考 docs/axes/radial/linear.md。延伸阅读雷达图完整配置数据集属性、线样式、点样式、交互、默认配置docs/charts/radar.md数据组织结构与labels约定docs/general/data-structures.md径向线性刻度scales.r的全部选项docs/axes/radial/linear.md其他混合图表示例索引docs/samples/other-charts/index.md【免费下载链接】Chart.jsSimple HTML5 Charts using thetag项目地址: https://gitcode.com/gh_mirrors/ch/Chart.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门