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

如何使用Chart.js在环形图单个扇区内展示多个子分段且不影响图例

Chart.js 拆分环形进度图实现方案

1. 数据结构调整

将原本单一的「已完成」扇区拆分为多个对应不同用户的子项,给数据集添加自定义属性存储对应用户名,未完成项单独保留:

const progressData = {
  // 仅用于内部匹配,不会全量展示在图例中
  innerLabels: ['用户A完成量', '用户B完成量', '用户C完成量', '未完成'],
  datasets: [{
    data: [25, 15, 10, 50], // 前三项为不同用户的完成占比,最后一项为未完成占比
    backgroundColor: ['#16a34a', '#22c55e', '#4ade80', '#d1d5db'], // 已完成项用同色系深浅区分,未完成用灰色
    // 自定义属性存储对应用户名
    ownerUsers: ['张三', '李四', '王五', null]
  }]
}

2. 图例冗余过滤

通过图例的filter回调,仅保留「已完成」、「未完成」两个主图例,避免子项都出现在图例中:

const chartOptions = {
  plugins: {
    legend: {
      filter: (legendItem) => {
        // 自定义生成两个主图例项,过滤掉所有子项
        const showTexts = ['已完成', '未完成']
        return showTexts.includes(legendItem.text)
      },
      // 配合自定义生成图例的文本和样式
      labels: {
        generateLabels: (chart) => {
          const data = chart.data
          if (data.datasets.length) {
            return [
              {
                text: '已完成',
                fillStyle: '#16a34a',
                strokeStyle: '#16a34a'
              },
              {
                text: '未完成',
                fillStyle: '#d1d5db',
                strokeStyle: '#d1d5db'
              }
            ]
          }
          return []
        }
      }
    }
  }
}

3. 悬浮提示自定义

调整tooltip回调,悬浮到已完成子分段时显示对应用户名和完成量:

const chartOptions = {
  plugins: {
    tooltip: {
      callbacks: {
        label: (context) => {
          const userName = context.dataset.ownerUsers[context.dataIndex]
          const value = context.parsed
          if (userName) {
            return `完成人:${userName},完成占比:${value}%`
          }
          return `未完成占比:${value}%`
        }
      }
    }
  }
}

4. 额外适配建议

所有已完成子项统一使用绿色系的不同深浅,未完成使用独立的灰色系,保证视觉上已完成部分仍是连续的整体块,和未完成部分有明显区分,符合用户对进度环的常规认知。

内容的提问来源于stack exchange,提问作者Darcy Power

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:09:05