You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chart.js V3版本实现Gauge Chart(仪表盘图表)相关问题咨询

Chart.js 3.X 实现仪表盘(Gauge Chart)方案

Chart.js 3.X版本完全可以通过改造环形图(Doughnut Chart)实现仪表盘,相比2.X版本,3.X重构了配置结构,实现逻辑更清晰,无需额外插件即可完成基础仪表盘开发。

核心实现思路

  • 将环形图的绘制范围限定为180度,仅保留上半部分半圆作为仪表盘的显示区域,下半部分用透明数据占位
  • 用数据集的不同分段区分刻度区间、当前值进度段
  • 通过自定义插件实现指针、中心数值、刻度线的自定义绘制

基础实现代码示例

<!-- 页面先引入Chart.js 3.X资源,再添加画布元素 -->
<canvas id="gaugeChart" width="400" height="200"></canvas>
// 仪表盘基础配置,示例为0-100刻度,当前值65
const gaugeData = {
  datasets: [{
    // 前两项对应上半部分180度的数值:当前值/剩余值,第三项为下半部分透明占位
    data: [65, 35, 100],
    backgroundColor: [
      '#2196F3', // 当前进度颜色
      '#E0E0E0', // 剩余区域颜色
      'transparent' // 底部占位透明不可见
    ],
    borderWidth: 0,
    cutout: '75%' // 调整该参数可以修改仪表盘环形的粗细
  }]
};

const gaugeConfig = {
  type: 'doughnut',
  data: gaugeData,
  options: {
    rotation: -90, // 环形起始角度设为-90度,刚好从左侧水平位置开始
    circumference: 180, // 环形总绘制角度为180度,仅显示上半圆
    plugins: {
      legend: { display: false }, // 隐藏默认图例
      tooltip: { enabled: false } // 不需要悬浮提示可直接关闭
    }
  },
  // 自定义插件绘制指针与中心数值
  plugins: [{
    id: 'gaugeCustom',
    afterDraw: (chart) => {
      const { ctx, chartArea } = chart;
      const centerX = (chartArea.left + chartArea.right) / 2;
      const centerY = chartArea.bottom; // 仪表盘圆心固定在底部中点
      const radius = (chartArea.right - chartArea.left) / 2;
      const currentValue = chart.data.datasets[0].data[0];
      
      // 绘制中心数值文本
      ctx.save();
      ctx.font = 'bold 24px sans-serif';
      ctx.fillStyle = '#333';
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      ctx.fillText(`${currentValue}%`, centerX, centerY - radius * 0.3);
      
      // 计算指针角度并绘制
      const pointerAngle = -90 + (currentValue / 100) * 180;
      ctx.save();
      ctx.translate(centerX, centerY);
      ctx.rotate(pointerAngle * Math.PI / 180);
      // 指针线条
      ctx.beginPath();
      ctx.moveTo(-10, 0);
      ctx.lineTo(radius * 0.7, 0);
      ctx.lineWidth = 4;
      ctx.strokeStyle = '#f44336';
      ctx.lineCap = 'round';
      ctx.stroke();
      // 指针中心圆点
      ctx.beginPath();
      ctx.arc(0, 0, 8, 0, 2 * Math.PI);
      ctx.fillStyle = '#f44336';
      ctx.fill();
      ctx.restore();
    }
  }]
};

// 实例化仪表盘
const myGauge = new Chart(document.getElementById('gaugeChart'), gaugeConfig);

开发优化技巧

  • 如果需要多色刻度区间,可以将第一个数据集拆分为多个分段,比如[20,20,20,40,100],分别对应不同区间的背景色,即可实现红黄绿分段的刻度效果
  • 指针的长度、样式可以通过修改radius * 0.7的系数、lineWidth参数调整
  • 需要显示刻度线的话,可以在自定义插件的afterDraw钩子中循环计算不同角度绘制短线,无需引入额外依赖
  • 3.X版本的动画配置与2.X有差异,需要定制指针动画的话,可以在options.animation中配置onProgress钩子同步更新指针角度即可

内容的提问来源于stack exchange,提问作者Andre Mendes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:27:04