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

标签 javascript canvas chart.js

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

$.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);
  }    

});

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

最佳答案

我知道这是一篇旧文章,但由于它已经被查看了很多次,我将描述一个适用于当前 Chart.js 版本 2.9.3 的解决方案。
Plugin Core API提供了一系列可用于执行自定义代码的钩子(Hook)。您可以使用 afterDraw使用 CanvasRenderingContext2D 直接在 Canvas 上绘制图像(图标)的钩子(Hook).

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);
    });
  }
}],
标签的位置必须通过xAxes.ticks.padding 来定义。如下:
xAxes: [{
  ticks: {
    padding: 30
  }   
}],
请查看以下可运行的代码片段。

const labels = ['Red Vans', 'Blue Vans', 'Green Vans', 'Gray Vans'];
const images = ['/image/2RAv2.png', '/image/Tq5DA.png', '/image/3KRtW.png', '/image/iLyVi.png'];
const values = [48, 56, 33, 44];

new Chart(document.getElementById("myChart"), {
  type: "bar",
  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);
      });      
    }
  }],
  data: {
    labels: labels,
    datasets: [{
      label: 'My Dataset',
      data: values,
      backgroundColor: ['red', 'blue', 'green', 'lightgray']
    }]
  },
  options: {
    responsive: true,
    legend: {
      display: false
    },    
    scales: {
      yAxes: [{ 
        ticks: {
          beginAtZero: true
        }
      }],
      xAxes: [{
        ticks: {
          padding: 30
        }   
      }],
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="myChart" height="90"></canvas>

关于javascript - 如何使用 chart.js 将图像作为标签添加到 Canvas 图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30247579/

相关文章:

android - 运行一段时间后,SurfaceView破坏Surface

ruby-on-rails - 将 chart.js Canvas 导出到 Rails 中的 prawn-pdf

javascript - 具有多个 y 轴和不同比例的 Chartjs

javascript - 在 Chart.js 中使用自定义 x 轴以及月份和年份绘制条形图时出现问题

javascript - 代码在 Firefox 中有效,但在 Chrome 中无效

javascript - 一次使用多个 Canvas

javascript - 如何通知 AngularJS Jquery 插件所做的更改?

javascript - CSS 网格内的 Canvas 大小

javascript - 单击转到 url 和内容类名更改

javascript - PHP MySQL 查询在实际提交的行之前插入 3 行(来自 w2ui 表)