【问题标题】:return percentage in chart.js (v2+) legendchart.js (v2+) 图例中的返回百分比
【发布时间】:2016-10-16 03:36:17
【问题描述】:

Chart.js 2+ 不再返回饼图中图例项的百分比。

我将图例存储在名为#legend 的html 中的单独项目中。然后我将它的innerHTML 设置为myPieChart.generateLegend()。它返回颜色和名称,但我希望能够覆盖这个 HTML 模板以返回百分比,所以输出看起来像:

  • 一个
  • B
  • C

到:

  • 一个(13%)
  • B (50%)
  • C (37%)

我以前用legendTemplate 参数来做,但它似乎不再起作用了:

legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%> (<%=segments[i].value%>%)<%}%></li><%}%></ul>"

【问题讨论】:

  • 请为您的问题提供上下文和代码,以便其他人也可以从中受益;您目前如何生成图例文本?到目前为止,您尝试过什么?
  • 您好,感谢您的回复,请查看我的更新

标签: javascript jquery chart.js chart.js2


【解决方案1】:

Chart.js v2 具有与早期版本完全不同的 API。在升级之前,您应该仔细阅读新的documentation(然后不得不想知道哪里出了问题)。

根本变化(与您的问题有关)是:

  • legendTemplate 和 segments 不再可用。您应该改用legendCallback(在options 中)来覆盖默认的图例实现。以下是文档中关于此回调的内容:

生成图例的功能。接收要从中生成图例的图表对象。默认实现返回一个 HTML 字符串。

  • 您在segments 中使用的数据在legendCallback 函数的chart 参数(即您的实际图表对象)中可用:chart.data.datasets[0].data。
  • 现在我们知道从哪里获取所需数据,我们可以循环通过chart.data.datasets[0].data 来收集值并将它们附加到图例 HTML 字符串中。
  • 然后我们可以简单地调用myPieChart.generateLegend(),它会调用我们的legendCallback。

完整示例:

var myPieChart = new Chart(ctx, {
    type: 'pie',
    data: d,
    options: {
        responsive: true,
        maintainAspectRatio: false,
        tooltips: {
            callbacks: {
                label: function (tooltipItem, data) {
                    return data.labels[tooltipItem.index] + ' (' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index] + '%)';
                }
            }
        },
        legendCallback: function (chart) {
            var text = [];
            text.push('<ul class="' + chart.id + '-legend">');

            var data = chart.data;
            var datasets = data.datasets;
            var labels = data.labels;

            if (datasets.length) {
                for (var i = 0; i < datasets[0].data.length; ++i) {
                    text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
                    if (labels[i]) {
                        text.push(labels[i] + ' (' + datasets[0].data[i] + '%)');
                    }
                    text.push('</li>');
                }
            }
            text.push('</ul>');
            return text.join('');
        },
        legend: {
            // since you're providing your own legend
            display: false,
        },                
    }
});

var legend = myPieChart.generateLegend();
document.getElementById("legend").innerHTML = legend;

为了完整起见,我还在工具提示标签上添加了相同的TEXT (PERCENTAGE%) 模板(与图例类似,它们提供自己的回调来覆盖默认实现)。

我还建议浏览实际的 Chart.js 源代码,特别是查看 legendCallBack、generateLegend() 等,以更好地了解底层的工作原理。

【讨论】:

  • 它有效!非常感谢您迄今为止的所有帮助!
  • 很高兴我能帮上忙。
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2020-10-30
相关资源
最近更新 更多