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

Chart.js Doughnut Chart问题:无法正确实现数据与100%的对比展示

解决Chart.js环形图(Doughnut Chart)数据与100%对比的显示问题

问题分析

当前代码中每个数据集的data设置为[40, 100]这类格式,Chart.js会按照数据总和计算各部分占比,比如第一个数据集总和为140,40对应的占比是40/140≈28.57%,而非预期的40%,这直接导致图表显示不符合需求。

预期效果为:每个环形段展示实际数据占100%的比例,剩余部分用灰色填充至100%,通过多层环形嵌套呈现多组对比数据。

解决方案

将每个数据集的data调整为[实际数值, 100-实际数值],确保每组数据总和为100,让Chart.js能正确渲染出对应100%的占比。原有图例、tooltip等配置可保留,仅修改数据部分即可。

修改后的完整代码

HTML部分

<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<canvas id="multiDoughnutChart" style="max-height: 200px"></canvas>

JavaScript部分

new Chart('multiDoughnutChart', {
  type: "doughnut",
  data: {
    labels: ['Profit', 'Income', 'Loss'],
    datasets: [{
        // 40%占比,剩余60%用灰色填充
        data: [40, 60],
        backgroundColor: ['lightgreen', '#EFEFEF'],
        borderWidth: 10,
        borderRadius: [10, 0]
      },
      {
        // 25%占比,剩余75%用灰色填充
        data: [25, 75],
        backgroundColor: ['lightcoral', '#EFEFEF'],
        borderWidth: 10,
        borderRadius: [10, 0]
      },
      {
        // 50%占比,剩余50%用灰色填充
        data: [50, 50],
        backgroundColor: ['lightblue', '#EFEFEF'],
        borderWidth: 10,
        borderRadius: [10, 0]
      }
    ]
  },
  options: {
    cutout: '30%',
    hover: {
      mode: null
    },
    plugins: {
      legend: {
        position: 'bottom',
        labels: {
          generateLabels: chart => chart.data.labels.map((label, i) => ({
            text: label,
            idx: i,
            fillStyle: chart.data.datasets[i].backgroundColor[0],
            strokeStyle: '#fff',
            hidden: !chart.isDatasetVisible(i)
          }))
        },
        onClick: (event, legendItem, legend) => {
          legend.chart.getDatasetMeta(legendItem.idx).hidden = legend.chart.isDatasetVisible(legendItem.idx);
          legend.chart.update();
        }
      },
      tooltip: {
        filter: tooltipItem => tooltipItem.dataIndex == 0,
        callbacks: {
          label: ctx => ctx.raw + '%',
          labelColor: ctx => ({
            backgroundColor: ['lightgreen', 'lightcoral', 'lightblue'][ctx.datasetIndex],
            borderWidth: 0,
          })
        }
      }
    }
  }
});

关键说明

  • 数据逻辑修正:把每个数据集的第二个值从100改为100-实际数值,保证每组数据总和为100,让实际数值的占比直接对应其百分比。
  • 原有配置兼容:图例自定义点击切换、tooltip过滤显示等功能无需改动,可正常配合修正后的数据工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:57:50