web-dev-qa-db-ja.com

Chart.jsキャンバスプラグインにラベルを追加する方法は?

私は素晴らしいプラグインを使用しています Chart.js 、そしてそれぞれの中にラベルを表示する方法を見つけようとしています割合。だから私はそれをグーグルで検索し、このプルを見つけました: https://github.com/nnnick/Chart.js/pull/35

私はそれをテストするために簡単なフィドルをしましたが、機能しません:http://jsfiddle.net/marianico2/7ktug/1/

これはコンテンツです:

[〜#〜] html [〜#〜]

<canvas id="canvas" height="450" width="450"></canvas>

[〜#〜] js [〜#〜]

$(document).ready(function () {
    var pieData = [{
        value: 30,
        color: "#F38630",
        label: 'HELLO',
        labelColor: 'black',
        labelFontSize: '16'
    }, {
        value: 50,
        color: "#E0E4CC"
    }, {
        value: 100,
        color: "#69D2E7"
    }];

    var myPie = new Chart(document.getElementById("canvas").getContext("2d")).Pie(pieData, {
        labelAlign: 'center'
    });
});

documentation にこれに関する情報がないことを恐れています。

また、各部分のラベルを表示する方法を知りたいのですが、グラフの外側にあります。線でリンクされています。 highcharts.js のチャートも同様です。

ところで、私が上で言ったオプションを含むhtml5チャートの代替を勧めてくれたら嬉しいです。 flot プラグインについて聞いたことがありますが、アニメーションをサポートしていないのではないかと心配しています...

さらに情報が必要な場合はお知らせください。投稿を編集します。

41
harrison4

2つの場所にコードを追加する必要があります。例として、ドーナツを取ります。最初にラベル情報をデフォルトに追加します(元のChart.jsコードを見て、これと比較します)。

    chart.Doughnut.defaults = {
        segmentShowStroke : true,
        segmentStrokeColor : "#fff",
        segmentStrokeWidth : 2,
        percentageInnerCutout : 50,
        animation : true,
        animationSteps : 100,
        animationEasing : "easeOutBounce",
        animateRotate : true,
        animateScale : false,
        onAnimationComplete : null,
        labelFontFamily : "Arial",
        labelFontStyle : "normal",
        labelFontSize : 24,
        labelFontColor : "#666"
    };

次に、ドーナツが描かれている場所に行き、4つのctx行を追加します。

    animationLoop(config,null,drawPieSegments,ctx);

    function drawPieSegments (animationDecimal){
        ctx.font = config.labelFontStyle + " " + config.labelFontSize+"px " + config.labelFontFamily;
        ctx.fillStyle = 'black';
        ctx.textBaseline = 'middle';
        ctx.fillText(data[0].value + "%", width/2 - 20, width/2, 200);

ctx.fillTextを呼び出すと、テキストがキャンバスに配置されるので、それを使用してx、y座標でテキストを書き込むことができます。この方法を使用して基本的なラベルを作成できる必要があります。以下は、いじくり回すjsfiddleです。

http://jsfiddle.net/nCFGL/ (前述のコードについては、jsfiddleのJavaScriptセクションの行281および772をご覧ください)

より洗練されたものが必要な場合は、誰かがCharts.jsのバージョンをフォークしてツールチップを追加しました。ここに議論があります https://github.com/nnnick/Chart.js/pull/35 、そしてあなたはその議論の中にフォーク版へのリンクを見つけることができるでしょう。

32
Jack

これは文字通り何時間もかかり、実用的なソリューションを見つけました。

https://github.com/nnnick/Chart.js/pull/116

これが私の最終的なコードでした。私はドーナツのラベルとしてパーセンテージを表示しようとしていました

Chart.types.Doughnut.extend({
name: "DoughnutAlt",
draw: function() {
    Chart.types.Doughnut.prototype.draw.apply(this, arguments);
    this.chart.ctx.fillStyle = 'black';
    this.chart.ctx.textBaseline = 'middle';
    this.chart.ctx.textAlign = 'start';
    this.chart.ctx.font="18px Verdana";

    var total = 0;
    for (var i = 0; i < this.segments.length; i++) { 
        total += this.segments[i].value;      
    }

    this.chart.ctx.fillText(total , this.chart.width / 2 - 20, this.chart.height / 2, 100);
    for(var i = 0; i < this.segments.length; i++){
        var percentage = ((this.segments[i].value / total) * 100).toFixed(1);
        if( percentage > 3 ){
            var centreAngle = this.segments[i].startAngle + ((this.segments[i].endAngle - this.segments[i].startAngle) / 2),
                rangeFromCentre = (this.segments[i].outerRadius - this.segments[i].innerRadius) / 2 + this.segments[i].innerRadius;
            var x = this.segments[i].x + (Math.cos(centreAngle) * rangeFromCentre);
            var y = this.segments[i].y + (Math.sin(centreAngle) * rangeFromCentre);
            this.chart.ctx.textAlign = 'center';
            this.chart.ctx.textBaseline = 'middle';
            this.chart.ctx.fillStyle = '#fff';
            this.chart.ctx.font = 'normal 10px Helvetica';
            this.chart.ctx.fillText(percentage , x, y);
        }
     }
}
});
7
animesh manglik

各領域の値をグラフの外に表示できるようにする方法を見つけました。

また、値の回転を削除し、 here を参照しました

Donut関数内に次のコード行を追加します。 (Chart.jsファイルから変更した行を貼り付けました)。

    var Doughnut = function(data,config,ctx){

    var segmentTotal = 0;

    //In case we have a canvas that is not a square. Minus 10 pixels as padding round the Edge.
    var doughnutRadius = Min([height/2,width/2]) - 15;
    var cutoutRadius = doughnutRadius * (config.percentageInnerCutout/100);
    //Modified for setting the label values out side the arc
    var outRadius= doughnutRadius + cutoutRadius/3;
    var outRadiustop= doughnutRadius + cutoutRadius/5;
    ......
    ......
    ......

    function drawPieSegments (animationDecimal){
    :
    :



       if (config.scaleShowValues) {
                ctx.save();                
                ctx.translate(width / 2, height / 2);
                ctx.font = config.scaleFontStyle + ' ' + config.scaleFontSize + 'px ' + config.scaleFontFamily;
                ctx.textBaselne = 'middle';
                var a = (cumulativeAngle + cumulativeAngle + segmentAngle) / 2,
                    w = ctx.measureText(data[i].value).width,
                    b = Math.PI / 2 < a && a < Math.PI * 3 / 2;
                var c  = 0 < a && a < Math.PI;
                if(b){
                    ctx.textAlign = 'right';
                }
                else{
                    ctx.textAlign = 'left';
                }
                if(c){
                    ctx.translate(Math.cos(a) * outRadius +1 , Math.sin(a) * outRadius+1);

                }
                else{
                    ctx.translate(Math.cos(a) * outRadiustop, Math.sin(a) * outRadiustop);      
                }

                ctx.fillStyle = config.scaleFontColor;
                //If the segment angle less than 0.2, then the lables will overlap, so hiding it.
                if(segmentAngle > 0.2){
                    ctx.fillText(data[i].value,0,0);

                }
                ctx.restore();
     }

     ......
     ...... 

これで、値は各セクションの外側に表示され、回転しません。

3
Sareesh

この機能をすぐに使用できる分岐バージョン ChartNew があります。

ChartJSを使用する必要がある場合は、@ Jackのソリューションのこの改訂版を使用できます。

Chart.types.Doughnut.extend({
    name: "DoughnutAlt",
    draw: function() {
        Chart.types.Doughnut.prototype.draw.apply(this, arguments);
        this.chart.ctx.fillStyle = 'black';
        this.chart.ctx.textBaseline = 'middle';
        this.chart.ctx.fillText(this.segments[0].value + "%", this.chart.width / 2 - 20, this.chart.width / 2, 200);
    }
});
3
dunckr