gpt4 book ai didi

javascript - Chart.js - 定位 donut 标签

转载 作者:数据小太阳 更新时间:2023-10-29 05:14:29 25 4
gpt4 key购买 nike

我有一个使用 Chart.js 的网页。在此页面中,我正在渲染三个圆环图。在每个图表的中间,我想显示填充的 donut 的百分比。目前,我有以下代码,可以在这个Fiddle中看到.

function setupChart(chartId, progress) {
var canvas = document.getElementById(chartId);
var context = canvas.getContext('2d');

var remaining = 100 - progress;
var data = {
labels: [ 'Progress', '', ],
datasets: [{
data: [progress, remaining],
backgroundColor: [
'#8FF400',
'#FFFFFF'
],
borderColor: [
'#8FF400',
'#408A00'
],
hoverBackgroundColor: [
'#8FF400',
'#FFFFFF'
]
}]
};

var options = {
responsive: true,
maintainAspectRatio: false,
scaleShowVerticalLines: false,

cutoutPercentage: 80,
legend: {
display: false
},
animation: {
onComplete: function () {
var xCenter = (canvas.width / 2) - 20;
var yCenter = canvas.height / 2 - 40;

context.textAlign = 'center';
context.textBaseline = 'middle';

var progressLabel = data.datasets[0].data[0] + '%';
context.font = '20px Helvetica';
context.fillStyle = 'black';
context.fillText(progressLabel, xCenter, yCenter);
}
}
};

Chart.defaults.global.tooltips.enabled = false;
var chart = new Chart(context, {
type: 'doughnut',
data: data,
options: options
});
}

图表“运行”。但问题在于标签的渲染。标签未在 donut 中间垂直和水平居中。标签的位置也会根据屏幕分辨率发生变化。您可以通过调整图表在 Fiddle 中呈现的框架大小来查看标签更改位置。 .

我的问题是,如何始终将百分比定位在 donut 的中间?我的页面是一个响应式页面,所以保持一致的定位很重要但是,我不确定还能做什么。我觉得 textAligntextBaseline 属性不起作用,或者我误解了它们的用法。

谢谢!

最佳答案

根据 this answer ,您可以使用更高版本的插件来完成。我不知道你是否注意到,如果你在你的 fiddle 上一遍又一遍地增加宽度和减少宽度,你的 Canvas 的高度会变得越来越大(图表越来越向下)。

在您使用的版本上,您可以像这样扩展 doughnut Controller :

http://jsfiddle.net/ivanchaer/cutkqkuz/1/

Chart.defaults.DoughnutTextInside = Chart.helpers.clone(Chart.defaults.doughnut);
Chart.controllers.DoughnutTextInside = Chart.controllers.doughnut.extend({
draw: function(ease) {

var ctx = this.chart.chart.ctx;
var data = this.getDataset();

var easingDecimal = ease || 1;
Chart.helpers.each(this.getDataset().metaData, function(arc, index) {
arc.transition(easingDecimal).draw();

var vm = arc._view;
var radius = (vm.outerRadius + vm.innerRadius) / 2;
var thickness = (vm.outerRadius - vm.innerRadius) / 2;
var angle = Math.PI - vm.endAngle - Math.PI / 2;

ctx.save();
ctx.fillStyle = vm.backgroundColor;

ctx.font = "20px Verdana";
ctx.textAlign = 'center';
ctx.textBaseline = "middle";

var text = data.data[0] + '%';
ctx.fillStyle = '#000';
ctx.fillText(text, $(ctx.canvas).width()/2, $(ctx.canvas).height()/2);
});
ctx.fillStyle = '#fff';
ctx.fill();
ctx.restore();

}

});


function setupChart(chartId, progress) {
var canvas = document.getElementById(chartId);
var context = canvas.getContext('2d');
var remaining = 100 - progress;

var deliveredData = {
labels: [
"Value"
],
datasets: [{
data: [progress, remaining],
backgroundColor: [
'#8FF400',
'#FFFFFF'
],
borderColor: [
'#8FF400',
'#408A00'
],
hoverBackgroundColor: [
'#8FF400',
'#FFFFFF'
]
}]
};

var deliveredOpt = {
cutoutPercentage: 88,

animation: false,
legend: {
display: false
},
tooltips: {
enabled: false
}
};

var chart = new Chart(canvas, {
type: 'DoughnutTextInside',
data: deliveredData,
options: deliveredOpt
});

}

setupChart('standChart', 33);
setupChart('moveChart', 66);
setupChart('exerciseChart', 99);

关于javascript - Chart.js - 定位 donut 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40889913/

25 4 0