用Chart.js绘制半甜甜圈图

时间:2019-09-18 10:40:26

标签: javascript jquery html css

是否仍然要为chart.js甜甜圈图实现动画指示符?我要完成的工作看起来像这样:

End Result

我已经完成了图表的甜甜圈部分,但是似乎找不到找到增加值(大文本:89%(动态))或指标点的方法。

我使用的代码如下:

HTML

<canvas id="dashboardChart" width="400" height="400"></canvas>

JS

var ctx = document.getElementById("dashboardChart");
    var dashboardChart = new Chart(ctx, {
        type: 'doughnut',
        data: {
            labels: ["Red", "Orange", "Green"],
            datasets: [{
                label: '# of Votes',
                data: [33, 33, 33],
                backgroundColor: [
                    'rgba(231, 76, 60, 1)',
                    'rgba(255, 164, 46, 1)',
                    'rgba(46, 204, 113, 1)'
                ],
                borderColor: [
                    'rgba(255, 255, 255 ,1)',
                    'rgba(255, 255, 255 ,1)',
                    'rgba(255, 255, 255 ,1)'
                ],
                borderWidth: 5
            }]

        },
        options: {
            rotation: 1 * Math.PI,
            circumference: 1 * Math.PI,
            legend: {
                display: false
            },
            tooltip: {
                enabled: false
            },
            cutoutPercentage: 95
        }
    });

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

原始答案:

我不确定对此是否有快​​速简单的解决方案。

也许您可以直接在现有的饼图上创建第二个饼图,并使该饼图的周长仅几个像素,但旋转X倍,在本例中为89%。需要一点数学才能计算出半圆的89%。根据上面的图片,这不会给您一个漂亮的圆圈标记。它将为您提供一个彩色的小段,该圆段应该在该段上,并且借助一些CSS,可以将第二个饼图段四舍五入为您想要的形状。

第二个饼图可能看起来像这样...

var ctx2 = document.getElementById("dashboardChart2");
    var dashboardChart2 = new Chart(ctx2, {
        type: 'doughnut',
        data: {
            labels: ["Purple"],
            datasets: [{
                label: '# of Votes',
                data: [5],
                backgroundColor: [
                   'rgba(159, 90, 253, 1)'
                ],
                borderColor: [
                    'rgba(255, 255, 255 ,1)',
                ],
                borderWidth: 2
            }]

        },
        options: {
            rotation: 1 * Math.PI,/** This is where you need to work out where 89% is */
            circumference: 1 * Math.PI,/** put in a much smaller amount  so it does not take up an entire semi circle */
            legend: {
                display: false
            },
            tooltip: {
                enabled: false
            },
            cutoutPercentage: 95
        }
    });

对于可能涉及CSS的89%的大型企业而言。将文本直接放置在饼图的“最前面”(绝对涉及z-index和位置)

新答案:

也许您可以直接在现有的甜甜圈图上创建一个甜甜圈图,并使该甜甜圈图的第一个和第三个“条”的不透明度为0,因此无法看到它们。如果第一根柱的值为88.5,第二根柱的值为1,第三根柱的值为10.5,则第二根柱的有效宽度应为89%,宽度为1%(88.5 + 1 + 10.5 = 100)。

datasets: [{
   data: [88.5, 1,10.5],// how much space each bar should take 
   backgroundColor: [
      "rgba(0,0,0,0)", // bar 1: opacity 0
      "rgba(255,255,255,1)", // bar 2 is white
      "rgba(0,0,0,0)", // bar 3: opacity 0
   ],
   borderColor: [
      'rgba(0, 0, 0 ,0)',// bar 1 border opacity 0
      'rgba(46, 204, 113, 1)',// bar 2 border is green
      'rgba(0, 0, 0 ,0)'// bar 3 border opacity 0
   ],
   borderWidth: 3
}]

对于可能涉及CSS的89%的大型企业而言。将文本直接放置在饼图的“前面”

.percent {
 position: absolute;
    left: 50%;
    transform: translate(-50%, 0);
    font-size: 80px;
    bottom: 0;
}

经过小提琴演奏后,我有了... enter image description here

此处的示例:

https://jsfiddle.net/rjtsbeLc/3/

请注意,在相对和绝对定位的情况下,我将第二个甜甜圈图放置在现有的甜甜圈图的顶部,百分比文本在其顶部居中放置在底部。

.outer {
  position: relative;
  width: 600px;
  height: 400px;
}
canvas {
  position: absolute;
}

由于“圆”是矩形,所以它并不是您所需要的,但是我碰到了这个问题,它可能会帮助您确定如何将矩形四舍五入为圆...

Chart.js圆角为https://stackoverflow.com/a/36964890/5178301的甜甜圈