En un artículo anterior expliqué cómo añadir texto dentro de una grafica de tipo donut. Hoy te voy a mostrar cómo crear una gráfica tipo donut con múltiples anillos.

Extra! tambien veremos cómo modificar la información que aparece al pasar el ratón por encima de cada uno de los datos de la gŕafica.

Básicamente tenemos que declarar varios conjuntos de datos, donde cada conjunto de datos es un anillo. Hasta aqui todo bien. Si queremos mostrar una etiqueta «personalizada» para cada uno de los datos, tenemos que añadir las etiquetas en cada conjunto de datos y sobreescribir la función encargada de mostrar la información que aparece al pasar el ratón por encima. Ademas, ya de paso, hemos aprovechado para calcular el porcentage.

Código HTML

 <div id="mychart-holder">
    <canvas id="mychart"/>
 </div>

Código Javascript

var data = {
    labels: [],
    datasets: [
        {
            data: [2, 3, 8, 3, 4],
            backgroundColor: ["orange", "red", "green", "violet", "lightgreen"],
            labels: ["naranjas", "mandarinas", "manzanas", "berenjenas", "calabacines"]
        },
        {
            data: [2 + 3 + 8,  3 + 4],
            backgroundColor: ["springgreen", "lightblue"],
            labels: ["frutas", "hortalizas"],
        },
        {
            data: [2 + 3 + 8 + 3 + 4],
            backgroundColor: ["lightgray"],
            labels: ["total"],
        }
    ]
};

var myChart = new Chart(document.getElementById('mychart'), {
    type: 'doughnut',
    data: data,
    options: {
        cutoutPercentage: 20,
        maintainAspectRatio: true,
        responsive: true,
        legend: {
            display: false
        },
        animation: {
            animateScale: true,
            animateRotate: true
        },
        tooltips: {
             /* activa esta funcion si deseas no mostrar alguna de las etiquetas
            filter: function (item, data) {
                if (item.datasetIndex == 1) {
                if (item.index == 1) {
                   return false;
                  }
                }
                return true;
            },
            */            callbacks: {
                label: function(item, data) {
                    // get label and data
                    var labels = data.datasets[item.datasetIndex].labels;
                    var dataset = data.datasets[item.datasetIndex].data;
                    
                    var currentLabel = labels[item.index];
                    var currentValue = dataset[item.index];
                    
                    // calc percentage
                    var total = dataset.reduce(function(previousValue, currentValue, currentIndex, array) {
                        return previousValue + currentValue;
                    });
                    var percentage = ((currentValue/total) * 100);

                    // put label
                    return " " + currentLabel + ": " + currentValue + " (" + percentage.toFixed(1) + "%)";
                     
                }
            }
        },
    }
});

Aqui dejo el jsfiddle