将甜甜圈饼图显示为圆形进度 Chart.js

Aym*_* bz 5 javascript chart.js

我想问一下是否有一种方法可以将饼图制作为具有百分比值的圆形进度,我只想要一个颜色如下所示的切片:

在此处输入图片说明

这是我的小提琴,现在我只想要一个数据。

HTML:

<canvas id="chartProgress" width="300px" height="200"></canvas>
Run Code Online (Sandbox Code Playgroud)

JS:

var chartProgress = document.getElementById("chartProgress");
if (chartProgress) {
var myChartCircle = new Chart(chartProgress, {
type: 'doughnut',
data: {
  labels: ["Africa", 'null'],
  datasets: [{
    label: "Population (millions)",
    backgroundColor: ["#5283ff"],
    data: [68, 48]
  }]
},
plugins: [{
  beforeDraw: function(chart) {
    var width = chart.chart.width,
        height = chart.chart.height,
        ctx = chart.chart.ctx;

    ctx.restore();
    var fontSize = (height / 150).toFixed(2);
    ctx.font = fontSize + "em sans-serif";
    ctx.fillStyle = "#9b9b9b";
    ctx.textBaseline = "middle";

    var text = "68%",
        textX = Math.round((width - ctx.measureText(text).width) / 2),
        textY = height / 2;

    ctx.fillText(text, textX, textY);
    ctx.save();
  }
}],
options: {
  legend: {
    display: false,
  },
  responsive: true,
  maintainAspectRatio: false,
  cutoutPercentage: 85
}
});
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用普通的 HTML&CSS 或使用简单的插件来完成,但我想使用 Chart.js 来完成

umi*_*der 13

插件核心 API提供了可用于执行自定义代码的不同挂钩。您已经使用了beforeDraw钩子在甜甜圈的中间绘制了文本。

您现在还可以使用beforeInit挂钩修改图表配置以满足您的需求:

beforeInit: (chart) => {
  const dataset = chart.data.datasets[0];
  chart.data.labels = [dataset.label];
  dataset.data = [dataset.percent, 100 - dataset.percent];
}
Run Code Online (Sandbox Code Playgroud)

鉴于此代码,您的定义dataset看起来很简单,如下所示:

{
  label: 'Africa / Population (millions)',
  percent: 68,
  backgroundColor: ['#5283ff']
}
Run Code Online (Sandbox Code Playgroud)

最后,您必须定义一个tooltips.filter,以便工具提示仅出现在相关部分。

tooltips: {
  filter: tooltipItem => tooltipItem.index == 0
}
Run Code Online (Sandbox Code Playgroud)

请查看您修改后的代码,看看它是如何工作的。

beforeInit: (chart) => {
  const dataset = chart.data.datasets[0];
  chart.data.labels = [dataset.label];
  dataset.data = [dataset.percent, 100 - dataset.percent];
}
Run Code Online (Sandbox Code Playgroud)
{
  label: 'Africa / Population (millions)',
  percent: 68,
  backgroundColor: ['#5283ff']
}
Run Code Online (Sandbox Code Playgroud)