在Chart.js画布中有图例

时间:2015-12-02 17:14:41

标签: chart.js

这个问题很简单,但我还没找到一个可以找到答案的帖子。我已设法使用legendTemplate添加图例并在html中显示,但没有我可以在画布中显示此图例。

如果我想将图形导出为图像,那么将图例嵌入画布中会更好!我希望我不是唯一一个这样想的人。

据我所知,我已经看过generateLegend method,但它为非画布标签生成了html。

编辑---

我已经测试过,没有成功,在画布上使用svg图像的方法

这是my test

2 个答案:

答案 0 :(得分:2)

您可能希望使用通用的html到canvas解决方案来考虑使其保持灵活性,而不是更改Chart.js来执行此操作。

一个例子是https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas

从上面的链接

  

您不能只将HTML绘制到画布中。相反,你需要使用   包含要呈现的内容的SVG图像。绘制HTML   内容,您将使用包含HTML的<foreignObject>元素   将SVG图像绘制到画布中。

以下是您的代码的改编版本。我的精神没有太大变化 - 只是移动了一些代码

另外,请注意,这在IE中不起作用。但我认为你只是想根据你的评论想要Chrome。

<强>脚本

var radarChartData = {
  labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
  datasets: [{
    label: "My First dataset",
    fillColor: "rgba(220,220,220,0.2)",
    strokeColor: "rgba(220,220,220,1)",
    pointColor: "rgba(220,220,220,1)",
    pointStrokeColor: "#fff",
    pointHighlightFill: "#fff",
    pointHighlightStroke: "rgba(220,220,220,1)",
    data: [65, 59, 90, 81, 56, 55, 40]
  }, {
    label: "My Second dataset",
    fillColor: "rgba(151,187,205,0.2)",
    strokeColor: "rgba(151,187,205,1)",
    pointColor: "rgba(151,187,205,1)",
    pointStrokeColor: "#fff",
    pointHighlightFill: "#fff",
    pointHighlightStroke: "rgba(151,187,205,1)",
    data: [28, 48, 40, 19, 96, 27, 100]
  }]
};

// legend for Chart
var legend = "<ul style=\"list-style-type:none;\">";
radarChartData.datasets.forEach(function(dataset){
  legend += "<li><div style=\"background-color:" + dataset.strokeColor + ";height:0.5em;width:0.5em;float:left;margin-top:0.5em;margin-right:0.5em;\"></div><span style='font-family:Verdana;font-size: 12px;'>";
  if (dataset.label) {
    legend += dataset.label
  }
  legend += "</span></li>";
})
legend += "</ul>";

var data = '<svg xmlns="http://www.w3.org/2000/svg">' +
  '<foreignObject width="100%" height="100%">' +
  '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:20px">' +
  legend +
  '</div>' +
  '</foreignObject>' +
  '</svg>';

var DOMURL = window.URL || window.webkitURL || window;
var img = new Image();
var svg = new Blob([data], {
  type: 'image/svg+xml;charset=utf-8'
});
var url = DOMURL.createObjectURL(svg);

img.onload = function() {
  DOMURL.revokeObjectURL(url);

  Chart.types.Radar.extend({
    name: "RadarAlt",
    draw: function() {
      this.scale.yCenter = this.chart.width / 2;
      Chart.types.Radar.prototype.draw.apply(this, arguments);
      this.chart.ctx.drawImage(img, 0, this.chart.width);
    }
  });

  // create chart
  var ctx = document.getElementById("radaranalytics").getContext('2d');
  var radar = new Chart(ctx).RadarAlt(radarChartData, {
    responsive: true
  });
}
img.src = url;

<强> HTML

<canvas id="radaranalytics" height="350" width="300" />

小提琴 - https://jsfiddle.net/zn6seqr8/6/

答案 1 :(得分:0)

您可以使用 postion equal chartArea 在画布内插入图例,例如:

var chart = new Chart(ctx, {
...
options: {
    plugins: {
        legend: {
            display: true,
            position: 'chartArea'
        }
    }
 }
});