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

Chart.js饼图仅展示占比大于5%的百分比标签实现方法

Chart.js饼图小占比标签显示优化

问题描述

基于Chart.js开发饼图组件时,占比较小的扇区上的百分比标签显示拥挤、辨识度极低,影响页面美观,需要优化小占比项的标签显示逻辑。

需求规则

  • 所有数据项(含占比低于5%的项)均保留在饼图中正常展示,不做隐藏、合并处理
  • 仅占比大于5%的扇区显示对应的百分比文本标签
  • 占比不足5%的扇区隐藏对应的百分比标签

当前实现代码

<!DOCTYPE html>
<html>
  <head>
    <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script>
     -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.7.0"></script>
  </head>
  <body>
  <canvas id="myChart1" width="90" height="90" style="width:100%;max-width:650px"></canvas>
  <script>
        function getColors(length) {
        let pallet = ["#0074D9", "#FF4136", "#2ECC40", "#FF851B", "#7FDBFF", "#B10DC9", "#FFDC00", "#001f3f", "#39CCCC", "#01FF70", "#85144b", "#F012BE", "#3D9970", "#111111", "#AAAAAA"];
        let colors = [];
  
        for (let i = 0; i < length; i++) {
          colors.push(pallet[i % (pallet.length - 1)]);
        }
  
        return colors;
      }
      var xValues = ['Multimeter', 'UniBox', 'Toby', 'Cables', 'Test','nokia','samsung','Jio','honda'];
      var yValues = [2, 100, 223, 84, 197,3,8,7,50];
      var barColors = getColors(xValues.length);
      var ctx = document.getElementById("myChart1").getContext('2d');
     var myChart = new Chart(ctx, {
     type: 'pie',
     data: {
      labels: xValues,
      datasets: [{
        backgroundColor: barColors,
        data: yValues
      }]
     },
    options:{
      tooltips: {
        enabled: true
      },
      plugins: {
        datalabels: {
          formatter: (value, ctx) => {
    
            let sum = ctx.dataset._meta[0].total;
            let percentage = (value * 100 / sum).toFixed(2) + "%";
            return percentage;
    
    
          },
          color: '#fff',
        }
      },
      "legend": {
        "display": true,
        "labels": {
          "fontSize": 20,
        }
      },
      title: {
        display: true,
        fontColor: 'rgb(255, 0, 0)',
        fontSize: 25,
        text: "Current Inventory Received"
      }
    }
  });
  </script>
</body>

</html>

当前运行效果

优化前饼图标签拥挤效果

优化方案

直接修改plugins.datalabels配置项,新增display属性做占比阈值判断即可,无需改动其他业务逻辑,该配置完全兼容当前使用的Chart.js 2.7.2 + chartjs-plugin-datalabels 0.7.0版本,不需要升级依赖。

修改后的datalabels配置代码如下:

plugins: {
  datalabels: {
    // 控制标签显示逻辑
    display: (value, ctx) => {
      const sum = ctx.dataset._meta[0].total;
      const percentage = value * 100 / sum;
      // 阈值设置为5%,可根据业务需求自行调整数值
      return percentage >= 5;
    },
    formatter: (value, ctx) => {
      const sum = ctx.dataset._meta[0].total;
      const percentage = (value * 100 / sum).toFixed(2) + "%";
      return percentage;
    },
    color: '#fff',
  }
}

优化后小占比扇区不再显示重叠拥挤的标签,鼠标悬浮时仍可通过默认tooltip查看所有扇区的完整数据,不影响原有交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:17