如何在 Chart.js 上显示数据值

IT技术 javascript chart.js
2021-02-05 22:07:28

我想问一下是否可以使用Chart.js 显示数据值?我想打印图表。

感谢您的任何建议。

6个回答

后期编辑: Chart.js 有一个官方插件2.7.0+可以做到这一点:https : //github.com/chartjs/chartjs-plugin-datalabels

原答案:

您可以遍历点/条 onAnimationComplete 并显示值


预览

在此处输入图片说明


HTML

<canvas id="myChart1" height="300" width="500"></canvas>
<canvas id="myChart2" height="300" width="500"></canvas>

脚本

var chartData = {
    labels: ["January", "February", "March", "April", "May", "June"],
    datasets: [
        {
            fillColor: "#79D1CF",
            strokeColor: "#79D1CF",
            data: [60, 80, 81, 56, 55, 40]
        }
    ]
};

var ctx = document.getElementById("myChart1").getContext("2d");
var myLine = new Chart(ctx).Line(chartData, {
    showTooltips: false,
    onAnimationComplete: function () {

        var ctx = this.chart.ctx;
        ctx.font = this.scale.font;
        ctx.fillStyle = this.scale.textColor
        ctx.textAlign = "center";
        ctx.textBaseline = "bottom";

        this.datasets.forEach(function (dataset) {
            dataset.points.forEach(function (points) {
                ctx.fillText(points.value, points.x, points.y - 10);
            });
        })
    }
});

var ctx = document.getElementById("myChart2").getContext("2d");
var myBar = new Chart(ctx).Bar(chartData, {
    showTooltips: false,
    onAnimationComplete: function () {

        var ctx = this.chart.ctx;
        ctx.font = this.scale.font;
        ctx.fillStyle = this.scale.textColor
        ctx.textAlign = "center";
        ctx.textBaseline = "bottom";

        this.datasets.forEach(function (dataset) {
            dataset.bars.forEach(function (bar) {
                ctx.fillText(bar.value, bar.x, bar.y - 5);
            });
        })
    }
});

小提琴 - http://jsfiddle.net/uh9vw0ao/

如果我在同一个图表中有两个折线图怎么办?
2021-03-14 22:07:28
这个是v1.0.2的,v2.1.3的怎么做?后面的版本对象结构不一样了。
2021-03-22 22:07:28
上面的它仍然会显示值,但如果点彼此太近,您可能会看到重叠。但是你总是可以加入逻辑来改变value位置。例如 - jsfiddle.net/hh719qex如果您有彩色打印机。如果你只有 2 个系列,你也可以做一些事情,比如设置 textBaseline 不同,如果 2 个点彼此接近 2。
2021-04-02 22:07:28
@potatopeelings 我在onComplete这里使用了回调,但是当鼠标悬停在图表的条形上时它也会触发,导致数字由于重绘而闪烁。如果是这样onAnimationComplete吗?我无法将此回调与我现有的图表代码一起使用(请参阅var chartBar底部的pastebin.com/tT7yTkGh
2021-04-03 22:07:28
我需要图表中条形顶部的工具提示和数据。当工具提示显示时,栏顶部的数据变为白色,这在我的透明工具提示中可见。我怎样才能解决这个问题?
2021-04-07 22:07:28

这是 Chart.js 2.3 的更新版本

2016 年 9 月 23 日:编辑了我的代码以使用 v2.3 的线条/条形类型。

重要提示:即使您不需要动画,也不要将持续时间选项更改为 0,否则您会得到chartInstance.controller is undefined错误。

var chartData = {
    labels: ["January", "February", "March", "April", "May", "June"],
        datasets: [
            {
                fillColor: "#79D1CF",
                strokeColor: "#79D1CF",
                data: [60, 80, 81, 56, 55, 40]
            }
        ]
    };

var opt = {
    events: false,
    tooltips: {
        enabled: false
    },
    hover: {
        animationDuration: 0
    },
    animation: {
        duration: 1,
        onComplete: function () {
            var chartInstance = this.chart,
                ctx = chartInstance.ctx;
            ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);
            ctx.textAlign = 'center';
            ctx.textBaseline = 'bottom';

            this.data.datasets.forEach(function (dataset, i) {
                var meta = chartInstance.controller.getDatasetMeta(i);
                meta.data.forEach(function (bar, index) {
                    var data = dataset.data[index];                            
                    ctx.fillText(data, bar._model.x, bar._model.y - 5);
                });
            });
        }
    }
};
 var ctx = document.getElementById("Chart1"),
     myLineChart = new Chart(ctx, {
        type: 'bar',
        data: chartData,
        options: opt
     });
<canvas id="myChart1" height="300" width="500"></canvas>

var model = dataset._meta[0].data[i]._model; 实际上。
2021-03-16 22:07:28
这也不是全部的真相。我仍然得到例外。会想办法解决的。
2021-03-23 22:07:28
它实际上是 var model = dataset._meta[i].data[0]._model;
2021-04-06 22:07:28
看起来不像_meta[0]那么简单。事实上 _meta 对象不是一个数组,它有一个以数字为键的单个元素。我无法弄清楚数字背后的基本原理,所以我只是通过查看键列表来获取第一个元素,如下所示:var model = dataset._meta[Object.keys(dataset._meta)[0]] .data[i]._model;
2021-04-06 22:07:28
在条形图上尝试此操作时,我收到“未捕获的类型错误:无法读取未定义的属性 '0'”。酒吧是否使用“dataset.metaData[i]._model”以外的其他东西?
2021-04-08 22:07:28

此动画选项适用于条形图上的 2.1.3。

稍微修改@Ross 答案

animation: {
duration: 0,
onComplete: function () {
    // render the value of the chart above the bar
    var ctx = this.chart.ctx;
    ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
    ctx.fillStyle = this.chart.config.options.defaultFontColor;
    ctx.textAlign = 'center';
    ctx.textBaseline = 'bottom';
    this.data.datasets.forEach(function (dataset) {
        for (var i = 0; i < dataset.data.length; i++) {
            var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
            ctx.fillText(dataset.data[i], model.x, model.y - 5);
        }
    });
}}
不敢相信这么丑^^ 干得好
2021-03-14 22:07:28
我还必须设置hover: {animationDuration: 0}停止标签在悬停时动画化
2021-03-21 22:07:28
另外,请注意,如果您想在隐藏图例中的某些内容时隐藏标签,则需要在 forEach 循环之前添加以下内容: .filter(dataset => !dataset._meta[0].hidden)
2021-03-24 22:07:28
看起来不错,但在重新绘制工具提示时会闪烁。也不处理组合图表和堆叠条的累积数据标签上的冲突——这当然需要更多的编码。
2021-04-09 22:07:28
如果条形上方没有足够的空间,则此方法会导致值剪切。
2021-04-10 22:07:28

如果您使用插件chartjs-plugin-datalabels那么以下代码选项对象将有所帮助

确保import 'chartjs-plugin-datalabels';在typescript文件中导入<script src="chartjs-plugin-datalabels.js"></script>在 javascript 文件中添加引用

options: {
    maintainAspectRatio: false,
    responsive: true,
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true,
        }
      }]
    },
    plugins: {
      datalabels: {
        anchor: 'end',
        align: 'top',
        formatter: Math.round,
        font: {
          weight: 'bold'
        }
      }
    }
  }
你的答案很简单,对我有用。谢谢你。快乐编码。
2021-03-19 22:07:28
真的很好的解决方案!谢谢你善良的陌生人:-*
2021-03-25 22:07:28
这是最好的!
2021-03-26 22:07:28

基于@Ross 对 Chart.js 2.0 及更高版本的回答,我必须进行一些调整,以防止当条的高度选择到比例边界时出现这种情况。

例子

animation条形图选项属性:

animation: {
            duration: 500,
            easing: "easeOutQuart",
            onComplete: function () {
                var ctx = this.chart.ctx;
                ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'bottom';

                this.data.datasets.forEach(function (dataset) {
                    for (var i = 0; i < dataset.data.length; i++) {
                        var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
                            scale_max = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._yScale.maxHeight;
                        ctx.fillStyle = '#444';
                        var y_pos = model.y - 5;
                        // Make sure data value does not get overflown and hidden
                        // when the bar's value is too close to max value of scale
                        // Note: The y value is reverse, it counts from top down
                        if ((scale_max - model.y) / scale_max >= 0.93)
                            y_pos = model.y + 20; 
                        ctx.fillText(dataset.data[i], model.x, y_pos);
                    }
                });               
            }
        }
onComplete当我徘徊在酒吧的这会导致重绘和文字似乎blink.Would这与同执行回调onAnimationComplete呢?我无法用onAnimationComplete我现有的代码回调(见var chartBar在底部引擎收录。 com/tT7yTkGh
2021-03-15 22:07:28
@RaviKhambhati 是的,您可以在此答案中查看:stackoverflow.com/a/38797604/6402571
2021-03-21 22:07:28
文本在图表的鼠标悬停时闪烁.. 我尝试ctx.save()在最后调用但它没有帮助
2021-03-24 22:07:28
是否可以在饼图中做同样的事情
2021-03-26 22:07:28