这个问题很简单,但我还没找到一个可以找到答案的帖子。我已设法使用legendTemplate
添加图例并在html中显示,但没有我可以在画布中显示此图例。
如果我想将图形导出为图像,那么将图例嵌入画布中会更好!我希望我不是唯一一个这样想的人。
据我所知,我已经看过generateLegend method,但它为非画布标签生成了html。
编辑---
我已经测试过,没有成功,在画布上使用svg图像的方法
这是my test
答案 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" />
答案 1 :(得分:0)
您可以使用 postion equal chartArea 在画布内插入图例,例如:
var chart = new Chart(ctx, {
...
options: {
plugins: {
legend: {
display: true,
position: 'chartArea'
}
}
}
});