当前位置: 首页 > 知识库问答 >
问题:

ChartJS:datalabels:在饼图中显示百分比值

邵星光
2023-03-14

我有一个带有四个标签的图表:

var data = [{
    data: [50, 55, 60, 33],
    labels: ["India", "China", "US", "Canada"],
    backgroundColor: [
        "#4b77a9",
        "#5f255f",
        "#d21243",
        "#B27200"
    ],
    borderColor: "#fff"
}];

使用chartjs插件datalabelsplugin,我想用以下代码显示每个饼图中的百分比值:

formatter: (value, ctx) => {

        let datasets = ctx.chart.data.datasets;

        if (datasets.indexOf(ctx.dataset) === datasets.length - 1) {
            let sum = 0;
            datasets.map(dataset => {
                sum += dataset.data[ctx.dataIndex];
            });
            let percentage = Math.round((value / sum) * 100) + '%';
            return percentage;
        } else {
            return percentage;
        }
    },
    color: '#fff',
}

我得到的是所有饼片的100%价值,而不是各自的百分比。这是JSFIDLE(https://jsfiddle.net/kingBethal/a1Lvn4eb/7/)

共有3个答案

柴嘉石
2023-03-14

问题是如何计算总和。见下文。

不停摆弄

 var data = [{
   data: [50, 55, 60, 33],
   labels: ["India", "China", "US", "Canada"],
   backgroundColor: [
     "#4b77a9",
     "#5f255f",
     "#d21243",
     "#B27200"
   ],
   borderColor: "#fff"
 }];

 var options = {
   tooltips: {
     enabled: false
   },
   plugins: {
     datalabels: {
       formatter: (value, ctx) => {

         let datasets = ctx.chart.data.datasets;

         if (datasets.indexOf(ctx.dataset) === datasets.length - 1) {
           let sum = datasets[0].data.reduce((a, b) => a + b, 0);
           let percentage = Math.round((value / sum) * 100) + '%';
           return percentage;
         } else {
           return percentage;
         }
       },
       color: '#fff',
     }
   }
 };


 var ctx = document.getElementById("pie-chart").getContext('2d');
 var myChart = new Chart(ctx, {
   type: 'pie',
   data: {
     datasets: data
   },
   options: options
 });
鱼阳伯
2023-03-14

我想在公认的答案中添加一点,ctx.chart.data.datasets[0]。即使您通过单击图例过滤掉一些数据,data也始终会为您提供完整的数据,这意味着即使您过滤掉一些国家,您也会得到相同的百分比。

我使用了context.dataset._meta[0]。总计来获取过滤后的总数。

以下是工作片段:

var data = [{
  data: [50, 55, 60, 33],
  backgroundColor: [
    "#4b77a9",
    "#5f255f",
    "#d21243",
    "#B27200"
  ],
  borderColor: "#fff"
}];

var 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',
    }
  }
};


var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
  type: 'pie',
  data: {
  labels: ['India', 'China', 'US', 'Canada'],
    datasets: data
  },
  options: options
});
<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>
<canvas id="pie-chart"></canvas>
莫翰藻
2023-03-14

更新的小提琴精度为2位小数。

您没有计算总和,而是仅为每个值将当前值存储在总和中。

这是工作小提琴:https://jsfiddle.net/a1Lvn4eb/55/

var data = [{
    data: [50, 55, 60, 33],
    labels: ["India", "China", "US", "Canada"],
    backgroundColor: [
        "#4b77a9",
        "#5f255f",
        "#d21243",
        "#B27200"
    ],
    borderColor: "#fff"
}];

var options = {
    tooltips: {
        enabled: false
    },
    plugins: {
        datalabels: {
            formatter: (value, ctx) => {
                let sum = 0;
                let dataArr = ctx.chart.data.datasets[0].data;
                dataArr.map(data => {
                    sum += data;
                });
                let percentage = (value*100 / sum).toFixed(2)+"%";
                return percentage;
            },
            color: '#fff',
        }
    }
};

var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'pie',
    data: {
        datasets: data
    },
    options: options
});
 类似资料:
  • 问题内容: 以下是熊猫数据框和从中生成的条形图: 我需要在相应栏上方显示相应主题的每个兴趣类别的百分比。我可以创建带有百分比的列表,但是我不知道如何将其添加到相应栏的顶部。 问题答案: 尝试将以下循环添加到您的代码中: 说明 通常,您可以在图上添加注释。 此方法采用注释的值和放置注释的坐标。 在一个barplot,每个“条”是由a表示,并且每个这些矩形的具有属性,和矩形的左下角的COORDS,所有

  • 本文向大家介绍DevExpress之ChartControl实现饼状图百分比演示实例,包括了DevExpress之ChartControl实现饼状图百分比演示实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了DevExpress中ChartControl实现饼状图百分比演示的方法。分享给大家供大家参考。具体实现方法如下: 关键代码如下: 运行效果如下图所示: 希望本文所述对大家的C#程序

  • Highcharts 饼图 以下实例演示了显示图例饼图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。 配置 series 配置 设置 series 的 type 属性为 pie ,series.type 描述了数据列类型。默认值为 "line"。 var series = { type: 'pie' }; plotOptions plo

  • 我最近更新了我的charts.js库到最新版本(2.5.0)。这个版本不显示图表上的标签。 我有一个在《小提琴手:http://jsfiddle.net/g6fajwg8》上工作的例子。 但是,我完全按照示例中的方式定义了我的图表,但仍然看不到图表上的标签。 注意:在Google和Stackoverflow上有很多这样的问题,但其中大多数都是关于以前的版本,这些版本在它们上运行良好。

  • 我正在使用Jaspersoft Studio和JasperReports Server,都在v.5.6.0中。 我想创建一个饼图,以红色显示错误的百分比。 示例: $V{til_1}=总计 $V{state_1}=错误 总计:2-错误:1= 实际结果(包括问题): 但是,当我运行报告时,“红色”接缝的计算是正确的,图表输出图像没有-链接到下面附加的图像。 (50%红色而不是100%,33,3%红色

  • 我使用Jasper Report 5.2,我想生成PieChart并显示带有2个小数的百分比。 我用一个piechart创建了jrxml,数据源中填充了参数piechart类型列表。 jrxml是: 使用此代码,百分比以一个整数显示。我要带两个小数的百分比。这可能吗?