javascript - 前端如何根据传来的数据绘制饼图?
天蓬老师
天蓬老师 2017-04-11 11:17:16
[JavaScript讨论组]

如何根据传来的数据绘制成如下的饼图呢?
我很想知道不通过插件如何实现,没有一点思路?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(16)
高洛峰

echart、highchart。这两个js库比较好滴。文档比较全。

PHP中文网

這個輪子不好做,推薦使用別人的輪子,百度的echarts庫就可以實現了
Echarts

PHP中文网

可以用canvas

伊谢尔伦

多个不同颜色的半圆叠加、旋转

天蓬老师

canvas+1。

http://www.108js.com/article/article7/70046.html?id=220
http://blog.csdn.net/jia20003/article/details/10165009
http://www.tuicool.com/articles/rqYjUn

迷茫
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <canvas id="canvas" width=400 height=300></canvas>
    <script>
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    var cw = canvas.width;
    var ch = canvas.height;

    ctx.lineWidth = 2;
    ctx.font = '12px verdana';

    var PI2 = Math.PI * 2;
    var myColor = ["Green", "Red", "Blue"];
    var pieData = [{
        name: '空调',
        value: '30'
    }, {
        name: '彩电',
        value: '60'
    }, {
        name: 'PS4',
        value: '10'
    }]
    var myData = [30, 60, 10];
    var cx = 150;
    var cy = 150;
    var radius = 100;

    pieChart(pieData, myColor);

    function pieChart(data, colors) {
        var total = 0;
        for (var i = 0; i < data.length; i++) {
            total += +data[i].value;
        }
        var sweeps = []
        for (var i = 0; i < data.length; i++) {
            sweeps.push(data[i].value / total * PI2);
        }

        var accumAngle = 0;
        for (var i = 0; i < sweeps.length; i++) {
            drawWedge(accumAngle, accumAngle + sweeps[i], colors[i], data[i], total);
            accumAngle += sweeps[i];
        }


    }

    function drawWedge(startAngle, endAngle, fill, label, total) {

        // draw the wedge
        ctx.beginPath();
        ctx.moveTo(cx, cy);
        ctx.arc(cx, cy, radius, startAngle, endAngle, false);
        ctx.closePath();
        ctx.fillStyle = fill;
        ctx.strokeStyle = 'white';
        ctx.fill();
        ctx.stroke();

        // draw the label
        var midAngle = startAngle + (endAngle - startAngle) / 2;
        var labelRadius = radius * .75;
        var x = cx + (labelRadius) * Math.cos(midAngle) - 10;
        var y = cy + (labelRadius) * Math.sin(midAngle);
        ctx.fillStyle = 'white';
        ctx.fillText(label.name, x, y);
        ctx.fillText(label.value % total + '%', x, y + 20);


    }
    </script>
</body>

</html>
高洛峰

highcharts.js

<script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/highcharts/4.2.5/highcharts.js"></script>
<script type="text/javascript">
$(function () {
$('#pieContainer').highcharts({
    chart: {
        plotBackgroundColor: null,
        plotBorderWidth: null,
        plotShadow: false
    },
    title: {text: ''},//这里是标题
    tooltip: {
        //pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'    //饼上显示文字:第1种
        pointFormat: '{series.name}: <b>{point.percentage}%</b>',        //饼上显示文字:第2种
        //formatter: function() {
            //    return '<b>'+ this.point.name +'</b>: '+ this.percentage +' %';    //饼上显示文字:第3种
            //}
    },
    credits: {    
        enabled:false    //去掉水印
        //text: 'e.com',
        //href: 'http://www.e.com'
    },
    plotOptions: {        //饼外面拉出的黑线和文字
        pie: {
            allowPointSelect: true,
            cursor: 'pointer',
            dataLabels: {
              enabled: true,        //设为false,不显示:饼外面拉出的黑线和文字
              color: '#000000',
              connectorColor: '#000000',
              format: '<b>{point.name}</b>: {point.percentage} %'
              //format: '<b>{point.name}</b>: {point.percentage:.1f} %'
            }
        }
    },
    series: [{
            type: 'pie',
            name: 'Browser share',
            //colors: ['#1ccb6a','#1ccb6a','#1ccb6a','#f7ef1e','#f7ef1e','#f7ef1e','#f7ef1e'],//指定颜色
            data: [
                ['布艺装饰',10],
                ['家电',20],
                ['家具',27],

                ['设计费',5],
                ['管理费',4],
                ['人工费',10],
                ['材料费',24],

            ]
        }]
    });
});
</script>
<p id="pieContainer" style="width:600px;height:400px;"></p>
PHP中文网

思路:获得数据,清空canvas区域,然后重绘,循环反复,over

阿神

D3.js不能用吗?

天蓬老师

这是一个很常见的需求,应该有相应的开源类库可以使用,但是具体使用哪一种,要根据您选择的js框架来决定。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号