如何使用chart.js将图像作为标签添加到Canvas Charts

jar*_*d k 7 javascript canvas chart.js

我正在生成一个chart.js画布条形图.我想要做的是,在标签数组中,添加与每个标签一起使用的图像,而不仅仅是文本标签本身.这是图表的代码:我从中获取数据的json对象有一个我想用来显示图片的图片网址:

$.ajax({
method: "get",
url: "http://localhost:3000/admin/stats/show",
dataType: "json",
error: function() {
  console.log("Sorry, something went wrong");
},
success: function(response) {
  console.log(response)
  var objectToUse = response.top_dogs
  var updateLabels = [];
  var updateData = [];
  for (var i = 0; i < objectToUse.length; i+=1) {
    updateData.push(objectToUse[i].win_percentage * 100);
    updateLabels.push(objectToUse[i].title);
  }
  var data = {
    labels: updateLabels,
    datasets: [
      {
        label: "Top Winners Overall",
        fillColor: get_random_color(),
        strokeColor: "rgba(220,220,220,0.8)",
        highlightFill: get_random_color(),
        highlightStroke: "rgba(220,220,220,1)",
        data: updateData
      }
    ]
  };

  var options = {
    //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
    scaleBeginAtZero : true,

    //Boolean - Whether grid lines are shown across the chart
    scaleShowGridLines : true,

    //String - Colour of the grid lines
    scaleGridLineColor : "rgba(0,0,0,.05)",

    //Number - Width of the grid lines
    scaleGridLineWidth : 1,

    //Boolean - Whether to show horizontal lines (except X axis)
    scaleShowHorizontalLines: true,

    //Boolean - Whether to show vertical lines (except Y axis)
    scaleShowVerticalLines: true,

    //Boolean - If there is a stroke on each bar
    barShowStroke : true,

    //Number - Pixel width of the bar stroke
    barStrokeWidth : 2,

    //Number - Spacing between each of the X value sets
    barValueSpacing : 5,

    //Number - Spacing between data sets within X values
    barDatasetSpacing : 2,
  };

  var loadNewChart = new Chart(barChart).Bar(data, options);
  }    
Run Code Online (Sandbox Code Playgroud)

});

如果有人有解决方案,将不胜感激!

umi*_*der 8

我知道这是一篇旧帖子,但由于它已经被查看了很多次,我将描述一个适用于当前 Chart.js 版本 2.9.3 的解决方案。

所述插件核心API提供了一系列可用于执行自定义代码钩。您可以使用afterDraw钩子直接在画布上绘制图像(图标)CanvasRenderingContext2D

plugins: [{
  afterDraw: chart => {
    var ctx = chart.chart.ctx;
    var xAxis = chart.scales['x-axis-0'];
    var yAxis = chart.scales['y-axis-0'];
    xAxis.ticks.forEach((value, index) => {
      var x = xAxis.getPixelForTick(index);
      var image = new Image();
      image.src = images[index],
        ctx.drawImage(image, x - 12, yAxis.bottom + 10);
    });
  }
}],
Run Code Online (Sandbox Code Playgroud)

标签的位置必须通过xAxes.ticks.padding如下定义:

xAxes: [{
  ticks: {
    padding: 30
  }   
}],
Run Code Online (Sandbox Code Playgroud)

请查看以下可运行的代码片段。

plugins: [{
  afterDraw: chart => {
    var ctx = chart.chart.ctx;
    var xAxis = chart.scales['x-axis-0'];
    var yAxis = chart.scales['y-axis-0'];
    xAxis.ticks.forEach((value, index) => {
      var x = xAxis.getPixelForTick(index);
      var image = new Image();
      image.src = images[index],
        ctx.drawImage(image, x - 12, yAxis.bottom + 10);
    });
  }
}],
Run Code Online (Sandbox Code Playgroud)
xAxes: [{
  ticks: {
    padding: 30
  }   
}],
Run Code Online (Sandbox Code Playgroud)