微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何在chart.js中显示每个切片的饼图数据值

我在我的PHP页面中使用Chart.js绘制饼图.我发现工具提示显示每个切片值.

enter image description here


但我希望显示如下图像的值.

enter image description here

我不知道如何用chart.js做到这一点.

请帮我.

我的Javascript代码

function drawPie(canvasId,data,legend){
    var ctx = $("#pie-canvas-" + canvasId).get(0).getContext("2d");

    var piedata = [];
    $.each(data,function(i,val){
        piedata.push({value:val.count,color:val.color,label:val.status});
    });
    var options =
    {
        tooltipTemplate: "<%= Math.round(circumference / 6.283 * 100) %>%",
    }
    var pie = new Chart(ctx).Pie(piedata,options);
    if(legend)document.getElementById("legend").innerHTML = pie.generateLegend();
}

PHP代码

printf('<table><tr>');
echo '<td style="text-align: right;"><canvas id="pie-canvas-'
    . $canvasId
    . '" width="256" height="256" ></canvas></td><td style="text-align: left;width:360px;height:auto" id="legend" class="chart-legend"></td></tr></table>';

     echo '<script type="text/javascript">drawPie('
    . $canvasId
    . ', '
    . $data3
    .', '
    . $legend
    . ');</script>';

enter image description here

解决方法:

据我所知,我不相信Chart.JS有任何功能可以帮助在饼图上绘制文本.但这并不意味着你不能在原生JavaScript中自己做.我将举例说明如何做到这一点,下面是饼图中每个段的绘图文本的代码

function drawSegmentValues()
{
    for(var i=0; i<myPieChart.segments.length; i++) 
    {
        // Default properties for text (size is scaled)
        ctx.fillStyle="white";
        var textSize = canvas.width/10;
        ctx.font= textSize+"px Verdana";

        // Get needed variables
        var value = myPieChart.segments[i].value;
        var startAngle = myPieChart.segments[i].startAngle;
        var endAngle = myPieChart.segments[i].endAngle;
        var middleAngle = startAngle + ((endAngle - startAngle)/2);

        // Compute text location
        var posX = (radius/2) * Math.cos(middleAngle) + midX;
        var posY = (radius/2) * Math.sin(middleAngle) + midY;

        // Text offside to middle of text
        var w_offset = ctx.measureText(value).width/2;
        var h_offset = textSize/4;

        ctx.fillText(value, posX - w_offset, posY + h_offset);
    }
}

饼图有一个存储在PieChart.segments中的段数组,我们可以查看这些段的startAngle和endAngle,以确定文本在midAngle之间的角度.然后我们将在Radius / 2的那个方向上移动到弧度图表的中间点.

在上面的示例中,完成了一些其他清理操作,由于fillText()中绘制的文本位置是右上角,我们需要获取一些偏移值来纠正它.最后textSize是根据图表本身的大小确定的,图表越大文本越大.

Fiddle Example

通过一些细微的修改,您可以将数据集的离散数值更改为图表中的百分位数.要执行此操作,请获取数据集中项目的总值,并调用此totalValue.然后在每个细分中,您可以通过以下方式找到百分比:

Math.round(myPieChart.segments[i].value/totalValue*100)+'%';

这里的部分myPieChart.segments [i] .value / totalValue用于计算细分在图表中占据的百分比.例如,如果当前段的值为50且totalValue为200.那么段占用的百分比将为:50/200 => 0.25.剩下的就是让它看起来不错. 0.25 * 100 => 25,然后我们在最后添加一个%.对于整数百分比的图块,我舍入到最接近的整数,但可能会导致准确性问题.如果我们需要更高的准确度,您可以使用.toFixed(n)来保存小数位.例如,我们可以在需要时保存一个小数位:

var value = myPieChart.segments[i].value/totalValue*100;
if(Math.round(value) !== value)
    value = (myPieChart.segments[i].value/totalValue*100).toFixed(1);
value = value + '%';

Fiddle Example of percentile with decimals

Fiddle Example of percentile with integers

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐