标题:简易js图表
取消只看楼主
leeqihero
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:122
专家分:135
注 册:2016-3-24
结帖率:20%
 问题点数:0 回复次数:0 
简易js图表
<html>
<head>
<meta charset="utf-8">
<script>
$=function(b){return document.getElementById(b)};
var 序列={
    初始化:function(我的配置){
        var 配置={
            标题:'我的标题',
            画布id:0,
            颜色:['red','blue','grey','gold'],
            柱子间隔:20,
        };
        for(var i in 我的配置){
            配置[i]=我的配置[i];
        };
        var 场景=$(配置.画布id).getContext("2d");
        场景.canvas.width=700;
        场景.canvas.height=450;
        var 数据=[];
        var 标签=[];
        var s=this;
        for(var i in s){
            if(typeof s[i]!='function'){
                标签.push(i);
                数据.push(s[i]);
            }
        };
        return {标签,数据,场景,配置};
    },
    柱状图:function(我的配置){
        with(this.初始化(我的配置)){
            var 最大值=Math.max.apply({},数据);
            var 图高=场景.canvas.height-120;
            var len=数据.length;
            var x = 0;
            var y = 场景.canvas.height-50;
            场景.textAlign = 'center';
            场景.fillStyle='black';
            场景.font='30px Arial';
            场景.fillText(配置.标题, 场景.canvas.width/2, 30);
            for(var i=0; i<len; i++){
                场景.font='10px Arial';
                var 柱子高=数据[i]/最大值*图高;
                var 柱子宽=(场景.canvas.width-(len-1)*配置.柱子间隔)/len;
                //画柱子:
                场景.fillStyle = 配置.颜色[i%配置.颜色.length];
                场景.lineWidth = 2;
                场景.beginPath();
                场景.moveTo(x, y);
                场景.lineTo(x, y - 柱子高);
                场景.lineTo(x + 柱子宽, y - 柱子高);
                场景.lineTo(x + 柱子宽, y);
                场景.closePath();
                场景.fill();
                //画标签和数据:
                场景.fillText(标签[i], x+柱子宽/2, y+20, 柱子宽);
                场景.fillText(数据[i], x+柱子宽/2, y-柱子高-10, 柱子宽);
                x+=柱子宽+配置.柱子间隔;
            };
        }
    },
    饼图:function(我的配置){
        with(this.初始化(我的配置)){
            var len=数据.length;
            var x = 场景.canvas.width/2;
            var y = 场景.canvas.height/2;
            var r = 场景.canvas.height/3;
            var 弧度=[0];
            var 标签弧度=[];
            var sum=0;
            for(var i=0;i<数据.length;i++){
                sum+=数据[i];
                弧度.push(sum);
            };
            for(var i=1;i<弧度.length;i++){
                弧度[i]=弧度[i]/sum*2*Math.PI;
                标签弧度.push((弧度[i]+弧度[i-1])/2);
            };
            场景.textAlign = 'center';
            场景.fillStyle='black';
            场景.font='30px Arial';
            场景.fillText(配置.标题, 场景.canvas.width/2, 30);
            for(var i=0; i<len; i++){
                场景.font='10px Arial';
                //画扇形:
                场景.fillStyle = 配置.颜色[i%配置.颜色.length];
                场景.lineWidth = 2;
                场景.beginPath();
                场景.moveTo(x,y);
                场景.arc(x,y,r,弧度[i+1],弧度[i],true);
                场景.closePath();
                场景.fill();
                //画标签和数据:
                场景.fillText(标签[i], x+(r+15)*Math.cos(标签弧度[i]), y+(r+15)*Math.sin(标签弧度[i]), 20);
            };
        }
    }
}
</script>
</head>
<body>
<canvas id=0></canvas>
<canvas id=1></canvas>
</body>
<script>
//自定义区域
({
    亚洲:122,
    欧洲:66,
    美洲:84,
    大洋洲:22,
    非洲:69,
    南极洲:10,
    __proto__:序列,
}).柱状图({标题:'东元集团2018年销售业绩(亿元)',画布id:0});
({
    亚洲:122,
    欧洲:66,
    北美洲:40,
    南美洲:44,
    大洋洲:22,
    非洲:69,
    南极洲:10,
    __proto__:序列,
}).饼图({标题:'东元集团2018年销售业绩(亿元)',画布id:1});
</script>
</html>
搜索更多相关主题的帖子: var 配置 canvas 数据 标签 
2018-03-02 16:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484953-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.138889 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved