javascript - 在图表js中创建带有标签的饼图

标签 javascript chart.js

我正在尝试使用图表 js 创建饼图。我的数据如下。

data: {
    labels: ["Green", "Blue", "Gray", "Purple", "Yellow", "Red"],
    datasets: [{
      backgroundColor: ["#7ECFA2", "#866B42", "#77FF81", "#F127F8", "#9647BC", "#74CB15"],
      data: [2, 9, 2, 1, 1, 1]
    }]
  }

使用这些数据我可以创建一个饼图。但这里我的要求是,有没有一种方法可以直接在饼图内显示 label ,而不是悬停饼图。这是我当前的working fiddle .

如果我在饼图本身上获取图例值,我不介意图例是否被禁用。

请告诉我如何获得它。

谢谢

最佳答案

这个 github 问题是关于如何在图表 js V2 中始终显示工具提示。

https://github.com/chartjs/Chart.js/issues/1861

您需要为您的图表创建一个插件。为了获得更完整的答案,我只需从上面链接中的 jsfiddle 复制代码。考虑到您的图表位于 html 中:

<canvas id="canvas"></canvas>

然后您为图表制作数据和插件:

    var ctx = document.getElementById("canvas").getContext("2d");

    var data = {
        labels: [
            "Red",
            "Green",
            "Yellow"
        ],
        datasets: [
            {
                data: [300, 50, 100],
                backgroundColor: [
                    "#FF6384",
                    "#36A2EB",
                    "#FFCE56"
                ],
                hoverBackgroundColor: [
                    "#FF6384",
                    "#36A2EB",
                    "#FFCE56"
                ]
            }]
    };

    Chart.pluginService.register({
        beforeRender: function (chart) {
            if (chart.config.options.showAllTooltips) {
                // create an array of tooltips
                // we can't use the chart tooltip because there is only one tooltip per chart
                chart.pluginTooltips = [];
                chart.config.data.datasets.forEach(function (dataset, i) {
                    chart.getDatasetMeta(i).data.forEach(function (sector, j) {
                        chart.pluginTooltips.push(new Chart.Tooltip({
                            _chart: chart.chart,
                            _chartInstance: chart,
                            _data: chart.data,
                            _options: chart.options.tooltips,
                            _active: [sector]
                        }, chart));
                    });
                });

                // turn off normal tooltips
                chart.options.tooltips.enabled = false;
            }
        },
        afterDraw: function (chart, easing) {
            if (chart.config.options.showAllTooltips) {
                // we don't want the permanent tooltips to animate, so don't do anything till the animation runs atleast once
                if (!chart.allTooltipsOnce) {
                    if (easing !== 1)
                        return;
                    chart.allTooltipsOnce = true;
                }

                // turn on tooltips
                chart.options.tooltips.enabled = true;
                Chart.helpers.each(chart.pluginTooltips, function (tooltip) {
                    tooltip.initialize();
                    tooltip.update();
                    // we don't actually need this since we are not animating tooltips
                    tooltip.pivot();
                    tooltip.transition(easing).draw();
                });
                chart.options.tooltips.enabled = false;
            }
        }
    })

    var myPieChart = new Chart(ctx, {
        type: 'pie',
        data: data,
        options: {
            showAllTooltips: true
        }
    });

如果您想了解有关如何创建图表 js 插件的更多信息,我发现这些链接非常有帮助:

https://www.chartjs.org/docs/latest/developers/plugins.html

https://levelup.gitconnected.com/how-to-write-your-own-chartjs-plugin-e46199ae5734

https://blog.larapulse.com/javascript/creating-chart-js-plugins

关于javascript - 在图表js中创建带有标签的饼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54864774/

相关文章:

javascript - 避免 JavaScript 中的函数闭包

javascript - 如何确定我网站的 FCP?

vue.js - 是否可以使用 vue-chartjs 打印图表?

javascript - 如何使用 Chart.js 向图表添加结束线?

javascript - 图表在 # 个链接期间消失

javascript - JSON 到 JQuery : What am I doing wrong?

javascript - 获取可变 div 高度并将 var 放入另一个 css 选择器中

javascript - 在 Aurelia 中将 chartjs-plugin-datalabels 添加到 Chart.js

javascript - 插入百分比 charts.js donut

javascript - useEffect 钩子(Hook)对 setTimeout 和 state 的行为不当