2016-05-02 14 views
16

Ho trovato similar questions in Stack Overflow, ma tutti erano indirizzati uno e due anni fa. Ora Chart.js è disponibile nella versione 2 e molte modifiche alla documentazione. Qualcuno può aiutarmi a mostrare un esempio di grafico a torta con etichette o il grafico a torta con tutte le descrizioni dei suoi segmenti sono visibili?Chart.js v2: Come far apparire sempre i tooltip nel grafico a torta?

UPDATE

Grazie alla @potatopeelings, la sua risposta funziona perfettamente per Chart.js v2.1.

Anche se inizialmente ho chiesto come visualizzare in modo permanente i suggerimenti sul grafico a torta, ho trovato una soluzione migliore: mostrare i valori come etichette in percentuale! Ora è abilitato per il grafico a torta in Chart.js v2.1. Nelle opzioni del grafico:

animation: { 
    duration: 0, 
    onComplete: function() { 
    var self = this, 
     chartInstance = this.chart, 
     ctx = chartInstance.ctx; 

    ctx.font = '18px Arial'; 
    ctx.textAlign = "center"; 
    ctx.fillStyle = "#ffffff"; 

    Chart.helpers.each(self.data.datasets.forEach(function (dataset, datasetIndex) { 
     var meta = self.getDatasetMeta(datasetIndex), 
      total = 0, //total values to compute fraction 
      labelxy = [], 
      offset = Math.PI/2, //start sector from top 
      radius, 
      centerx, 
      centery, 
      lastend = 0; //prev arc's end line: starting with 0 

     for (var val of dataset.data) { total += val; } 

     Chart.helpers.each(meta.data.forEach(function (element, index) { 
      radius = 0.9 * element._model.outerRadius - element._model.innerRadius; 
      centerx = element._model.x; 
      centery = element._model.y; 
      var thispart = dataset.data[index], 
       arcsector = Math.PI * (2 * thispart/total); 
      if (element.hasValue() && dataset.data[index] > 0) { 
       labelxy.push(lastend + arcsector/2 + Math.PI + offset); 
      } 
      else { 
       labelxy.push(-1); 
      } 
      lastend += arcsector; 
     }), self) 

     var lradius = radius * 3/4; 
     for (var idx in labelxy) { 
      if (labelxy[idx] === -1) continue; 
      var langle = labelxy[idx], 
       dx = centerx + lradius * Math.cos(langle), 
       dy = centery + lradius * Math.sin(langle), 
       val = Math.round(dataset.data[idx]/total * 100); 
      ctx.fillText(val + '%', dx, dy); 
     } 

    }), self); 
    } 
}, 
+0

Penso che questo sia quello che stai cercando. http://stackoverflow.com/questions/25661197/chart-js-doughnut-show-tooltips-ways/25913101#25913101 – Luke

+0

@Luke Ciao, grazie per il tempo che ci hai dedicato. Sfortunatamente quell'esempio stava usando chart.js v1.0.2. Le strutture dati e le configurazioni su v2 sono diverse da v1 – Danny

risposta

23

Soluzione per ChartJs versione> 2.1.5:

Chart.pluginService.register({ 
    beforeRender: function (chart) { 
    if (chart.config.options.showAllTooltips) { 
     // create an array of tooltips 
     // we can't use the chart tooltip because there is only one tooltip per chart 
     chart.pluginTooltips = []; 
     chart.config.data.datasets.forEach(function (dataset, i) { 
      chart.getDatasetMeta(i).data.forEach(function (sector, j) { 
       chart.pluginTooltips.push(new Chart.Tooltip({ 
        _chart: chart.chart, 
        _chartInstance: chart, 
        _data: chart.data, 
        _options: chart.options.tooltips, 
        _active: [sector] 
       }, chart)); 
      }); 
     }); 

     // turn off normal tooltips 
     chart.options.tooltips.enabled = false; 
    } 
}, 
    afterDraw: function (chart, easing) { 
    if (chart.config.options.showAllTooltips) { 
     // we don't want the permanent tooltips to animate, so don't do anything till the animation runs atleast once 
     if (!chart.allTooltipsOnce) { 
      if (easing !== 1) 
       return; 
      chart.allTooltipsOnce = true; 
     } 

     // turn on tooltips 
     chart.options.tooltips.enabled = true; 
     Chart.helpers.each(chart.pluginTooltips, function (tooltip) { 
      tooltip.initialize(); 
      tooltip.update(); 
      // we don't actually need this since we are not animating tooltips 
      tooltip.pivot(); 
      tooltip.transition(easing).draw(); 
     }); 
     chart.options.tooltips.enabled = false; 
    } 
    } 
}); 
+2

Grazie! Nella versione 2.4.0 è stato modificato in Chart.plugins.register –

+1

@ Fl0R1D3R - Esiste un modo per rendere le descrizioni dei comandi "rivolte verso l'altra direzione"? Attualmente sono rivolti verso il centro, che è un problema per i piccoli grafici: apprezzerei le idee. – st2rseeker

9

Con il nuovo Chart.js 2.1 è possibile scrivere un plugin per fare questo e controllarlo tramite una proprietà options


Anteprima

enter image description here


Script

Si noti che è necessario registrare il plugin prima di inizializzare la tabella di

Chart.pluginService.register({ 
    beforeRender: function (chart) { 
     if (chart.config.options.showAllTooltips) { 
      // create an array of tooltips 
      // we can't use the chart tooltip because there is only one tooltip per chart 
      chart.pluginTooltips = []; 
      chart.config.data.datasets.forEach(function (dataset, i) { 
       chart.getDatasetMeta(i).data.forEach(function (sector, j) { 
        chart.pluginTooltips.push(new Chart.Tooltip({ 
         _chart: chart.chart, 
         _chartInstance: chart, 
         _data: chart.data, 
         _options: chart.options, 
         _active: [sector] 
        }, chart)); 
       }); 
      }); 

      // turn off normal tooltips 
      chart.options.tooltips.enabled = false; 
     } 
    }, 
    afterDraw: function (chart, easing) { 
     if (chart.config.options.showAllTooltips) { 
      // we don't want the permanent tooltips to animate, so don't do anything till the animation runs atleast once 
      if (!chart.allTooltipsOnce) { 
       if (easing !== 1) 
        return; 
       chart.allTooltipsOnce = true; 
      } 

      // turn on tooltips 
      chart.options.tooltips.enabled = true; 
      Chart.helpers.each(chart.pluginTooltips, function (tooltip) { 
       tooltip.initialize(); 
       tooltip.update(); 
       // we don't actually need this since we are not animating tooltips 
       tooltip.pivot(); 
       tooltip.transition(easing).draw(); 
      }); 
      chart.options.tooltips.enabled = false; 
     } 
    } 
}); 

e poi

new Chart(ctx, { 
    type: 'pie', 
    data: data, 
    options: { 
     showAllTooltips: true 
     ... 

Con la versione precedente 2.x, si dovrebbe in grado di spostare il uguale (o simile, non sono sicuro della precedente struttura dati) a options.animation.onComplete


Fiddle - http://jsfiddle.net/q15ta78q/

+0

Tutte le descrizioni comandi non vengono visualizzate quando più dati sono con dati 0. link http://jsfiddle.net/q15ta78q/43/ dovrebbe mostrare, Rosso - 0, Verde -0, ma mostra solo Green-0. Come gestire questo scenario? C'è una domanda aperta, se puoi rispondere sarebbe grandiosa. Domanda: http://stackoverflow.com/questions/37790727/chart-js-donut-doughnut-chart-tooltip-to-be-shown-always-for-all-the-data-all – Raghu

+0

non funziona più per Chartjs 2.1.6. – Fl0R1D3R

+1

Sto usando charts.js 2.2.1 e questo funziona se si cambia \t \t \t \t \t \t \t \t '_options: chart.options' a ' _options: chart.options.tooltips' - – jessica

7

ero alla ricerca di una soluzione simile e sono imbattuto in questo chartjs plug Chart.PieceLabel.js. Ha configurazioni per visualizzare modalità come etichetta, valore e percentuale.

+0

Questo è esattamente quello che stavo cercando, tnx! – XVirtusX

Problemi correlati