2017-02-27 19 views
0

ドーナツチャートにパーセント値を表示しようとしています。私の機能が正しく動作するためには、コールバック内のチャートインスタンスにアクセスする必要があります。私はそれをする方法を知らない?Chart.jsの現在のツールチップコールバックに関連するChartインスタンスへのアクセス方法

Chart.pluginService beforeDrawイベントを使用して処理しましたが、期待通りに機能しません。

ツールチップコールバック内でbeforeDrawイベントからコードを移動する方法はありますか?

これは、私はあなたの問題を解決するための最善のアプローチは、実際にプラグインをしようとするのではなく、custom tooltipsを使用することだと思います私のコード

tooltips: { 
    callbacks: { 
    label: function (tooltipItem, data) { 

     var precentage = dataFromDoughnutChart; 

     localStorage.setItem("per", precentage.toString()); 

     return precentage + "%"; 
    } 
} 
} 

Chart.pluginService.register({ 

     beforeDraw: function (chart) { 

      var value = ""; 
      var x = localStorage.getItem("per"); 

      if (x != null) 
       value = x + "%"; 

      var width = chart.chart.width, 
       height = chart.chart.height, 
       ctx = chart.chart.ctx; 

      ctx.restore(); 
      var fontSize = (height/100).toFixed(2); 
      ctx.font = fontSize + "em sans-serif"; 
      ctx.textBaseline = "middle"; 

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

      ctx.fillText(text, textX, textY); 
      ctx.save(); 
     }, 
     afterEvent: function (chart, event) { 

      if (event.type == "mouseout") { 

       localStorage.removeItem("per"); 
      } 
     } 
    }); 
+0

あなたがより詳細にやろうとか説明できますか?ユーザーがドーナツをスライスした部分をロールオーバーしたときの割合を中央に表示しようとしていますか?また、あなたのアプローチに間違った振る舞いがあることを説明できますか?私は以前も同様のことをしていますが、あなたが何を理解しているか分かるまで共有したくありません。 – jordanwillis

+0

そうです、私はそれを正確に達成しようとしています。 beforeDrawイベントが複数回呼び出されるという誤った動作です。私はページ上にただ1つのドーナツチャートしか持っていません。そして、ドーナツチャートスライスから2番目のチャートにカーソルをすばやく移動すると、両方のチャートが同じ値をチャートの中央に表示しています。 [link] https://jsfiddle.net/cmyker/ooxdL2vj/ に基づいて何かをしようとしていて、ツールチップのコールバックから中間​​チャート領域のデータを入力しようとしています。 あなたの返信ありがとう – consoleapplication

答えて

0

です。ここでは、自分のレポのchart.jsサンプルページの1つから修正した実用的なソリューションを紹介します。

まず、yout HTMLにカスタムツールチップ用のコンテナを定義します。

<div id="chartjs-tooltip"></div> 

次に、以下のカスタムツールチップ機能を使用してください。あなたのニーズに合わせてcenterXの計算を微調整しなければならないかもしれません。この関数は、現在アクティブなスライスのパーセント値を(データポイントをデータポイントの合計値で割ることによって)計算し、カスタムツールチップdivに配置し、divをドーナツの中心に配置します。ここで

Chart.defaults.global.tooltips.custom = function(tooltip) { 
    // Tooltip Element 
    var tooltipEl = document.getElementById('chartjs-tooltip'); 

    // Hide if no tooltip 
    if (tooltip.opacity === 0) { 
    tooltipEl.style.opacity = 0; 
    return; 
    } 

    // Set Text 
    if (tooltip.body) { 
    var total = 0; 

    // get the value of the datapoint 
    var value = this._data.datasets[tooltip.dataPoints[0].datasetIndex].data[tooltip.dataPoints[0].index].toLocaleString(); 

    // calculate value of all datapoints 
    this._data.datasets[tooltip.dataPoints[0].datasetIndex].data.forEach(function(e) { 
     total += e; 
    }); 

    // calculate percentage and set tooltip value 
    tooltipEl.innerHTML = '<h1>' + (value/total * 100) + '%</h1>'; 
    } 

    // calculate position of tooltip 
    var centerX = (this._chartInstance.chartArea.left + this._chartInstance.chartArea.right)/2; 
    var centerY = ((this._chartInstance.chartArea.top + this._chartInstance.chartArea.bottom)/2); 

    // Display, position, and set styles for font 
    tooltipEl.style.opacity = 1; 
    tooltipEl.style.left = centerX + 'px'; 
    tooltipEl.style.top = centerY + 'px'; 
    tooltipEl.style.fontFamily = tooltip._fontFamily; 
    tooltipEl.style.fontSize = tooltip.fontSize; 
    tooltipEl.style.fontStyle = tooltip._fontStyle; 
    tooltipEl.style.padding = tooltip.yPadding + 'px ' + tooltip.xPadding + 'px'; 
}; 

codepen経て完全なエンドツーエンドの実施例である:

Chart.js Doughnut Center Percentage

+0

それは役に立ちました。私はあなたのソースコードを変更する必要がありますが、私はあなたのアイデアを使用しました。ありがとう – consoleapplication

関連する問題