【应用】SVG饼状图

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body onload="document.body.appendChild(
    pieChart([12,23,34,45],640,400,200,200,150,
    [‘red‘,‘blue‘,‘yellow‘,‘green‘],
    [‘North‘,‘South‘,‘East‘,‘West‘],400,100)
)">
<script>
    /*创建一个<svg>元素,并在其中绘制一个饼状图
    * 参数
    *   data:用于绘制的数字类型的数组,数组每一项都有表示饼状图的一个
    *   width,height:SVG图形的大小,单位像素
    *   cx,cy,r:饼状图的圆心及半径
    *   colors:一个包含HTML颜色信息的数组,每种颜色代表饼状图每个楔的颜色
    *   lables一个标签数组,该信息说明饼状图中每个楔代表的含义
    *   lx,ly:饼状图的左上角
    * 返回:
    *   一个保存饼状图的<svg>元素
    *   调用者必须返回的元素插入到文档中
    *   */
    function pieChart(data,width,height,cx,cy,r,colors,labels,lx,ly){
        //这个表示svg元素的xml命名空间
        var svgns="http://www.w3.org/2000/svg";

        //创建一个<svg>元素,同时指定像素大小和用户坐标
        var chart=document.createElementNS(svgns,"svg:svg");
        chart.setAttribute("width",width);
        chart.setAttribute("height",height);
        chart.setAttribute("viewBox","0 0 "+width+" "+height);

        //累加data值,以便于知道饼状图的大小
        var total=0;
        for(var i=0;i<data.length;i++){
            total+=data[i];
        }

        //现在计算出饼状图每个分片的大小,其中角度以弧度制计算
        var angles=[];
        for(var i=0;i<data.length;i++)
            angles[i]=data[i]/total*Math.PI*2;

        //遍历病状图的每个分片
        starttangle=0;
        for(var i=0;i<data.length;i++){
            //这里表示楔的结束为止
            var endangle=starttangle+angles[i];

            //计算出楔和园橡胶的两个点
            //这些计算公式都是以12点钟方向为0°
            //顺时针方向角度递增
            var x1=cx+r*Math.sin(starttangle);
            var y1=cy-r*Math.cos(starttangle);
            var x2=cx+r*Math.sin(endangle);
            var y2=cy-r*Math.cos(endangle);

            //这个标记表示角度大于半圆
            //此标记在绘制SBG弧形组件的时候需要
            var big=0;
            if(endangle-starttangle>Math.PI) big=1;

            //使用<svg:path>元素来描述楔
            //要注意的是,使用ctreateElementNS()来创建该元素
            var path=document.createElementNS(svgns,"path");

            //下面的字符串包含路径的详细信息
            var d="M "+cx+","+cy+ //从圆心开始
                " L "+x1+","+y1+   //画一条到(x1,y1)的线段
                " A "+r+","+r+     //再画一条半径为r的弧
                " 0 "+big+" 1 "+    // 弧的详细信息
                x2+","+y2+    //弧到(x2,y2)结束
                " Z";   //d当前路径到(cx,cy)结束

            //设置<svg:path>元素的属性
            path.setAttribute("d",d);   //设置路径
            path.setAttribute("fill",colors[i]); //设置楔的颜色
            path.setAttribute("stroke","black");  //楔的外边框为黑色
            path.setAttribute("stroke-width","2"); //两个单位
            chart.appendChild(path); //将楔加入到饼状图中

            //当前楔的结束就是下一个楔的开始
            starttangle=endangle;

            //绘制小方块表示图例
            var icon=document.createElementNS(svgns,"rect");
            icon.setAttribute("x",lx);  //定位小方块
            icon.setAttribute("y",ly+30*i);
            icon.setAttribute("width",20);
            icon.setAttribute("height",20);
            icon.setAttribute("fill",colors[i]); //填充小方块颜色和对应楔的颜色也相同
            icon.setAttribute("stroke","black");  //子外边框颜色也相同
            icon.setAttribute("stroke-width","2");
            chart.appendChild(icon);

            //在小方块的右边添加标签
            var label=document.createElementNS(svgns,"text");
            label.setAttribute("x",lx+30); //定位标签文本
            label.setAttribute("y",ly+30*i+18);
            label.setAttribute("font-family","sans-serif");
            label.setAttribute("font-size","16");
            label.appendChild(document.createTextNode(labels[i]));
            chart.appendChild(label); //将文本添加到饼状图
        }
        return chart;
    }

</script>
</body>
</html>

效果:

时间: 2024-10-20 20:13:06

【应用】SVG饼状图的相关文章

JavaScript+svg绘制的一个饼状图

svg参考:https://www.w3.org/TR/SVG/ <body onload='document.body.appendChild( pieChart([12,23,34,45],640,400,200,200,150, ["red","blue","yellow","green"], ["North","South","East","W

AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示

前言: "宁肯像种子一样等待  也不愿像疲惫的陀螺  旋转得那样勉强" 这是前几天在查资料无意间看到的一位园友的签名,看完后又读了两遍,觉得很有味道.后来一寻根究底才知这是出资大诗人汪国真之口,出处<她>.且抛开上下文,单从这短短几句,正恰如其分的折射出有一群人,他们穿着不那么fashion,言辞不那么犀利,但是内心某一块地方像是躁动的火山,拥有无尽的动力和激情,矢志不渝种子般投身到技术研究和心得分享当中. 或许每一次的生长都是那么悄无声息,但是无数次的坚持只是为了破土那日

【 D3.js 进阶系列 — 6.2 】 饼状图的拖拽

本文讲解稍微复杂一些的拖拽应用,即拖拽饼图的各部分. 在[入门 - 第 9.1 章]讲解了如何制作饼状图.饼状图的各部分是用具有宽度的弧线来表示的.在与用户进行交互的时候,如果每一部分都能拖拽,是很有趣的. 1.饼状图的绘制 与[入门 - 第 9.1 章]稍有有些不同,我们对饼状图的每一个区域都使用一个 g 标签将其包围起来,以便平移操作. var gAll = svg.append("g") .attr("transform","translate(&q

【 D3.js 入门系列 --- 9.1 】 饼状图的制作

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 这一节用 Layout 做一个饼状图.第9节中说过, Layout 的作用只是转换数据,将不适合图形化的数据转化成适合图形化的数据.现在使用以下数据: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这个数据要不能直接用于画饼状图,我们必须通过计算将它转换成角度.这个计算不需要我们手动计算,因为 D3 中提供了 d3.layo

使用d3.v5实现饼状图

效果图: 饼状图: 目录结构: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link href="css/style.css" media="screen" rel="stylesheet" type="text/css"/> <title

D3.js的v5版本入门教程(第十三章)—— 饼状图

D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这里作者本人也只是粗略的讲解每个新知识点的意思!如果不是很理解的话,需要读者自行查看官网API 为了绘制一个饼状图,我们还是需要以下新的知识点 d3.arc( {} ),弧形生成器,用以绘制弧形,需要传入一些用以绘制弧形基本的数据的对象,例如,该对象的属性可以包括(我用官网api的示例) d3.pie

php验证码+缩略图+饼状图+五环图

@1.验证码 1 captcher.php 2 header('Content-type:image/png'); 3 session_start(); 4 $img = imagecreate(100, 30); 5 $captcha = array( 6 'a', 'b', 'c', 'd', 'e', 'f', 7 'g', 'h', 'i', 'j', 'k', 'l', 8 'm', 'n', 'o', 'p', 'q', 'r', 9 's', 't', 'u', 'v', 'w',

iOS:使用贝塞尔曲线绘制图表(折线图、柱状图、饼状图)

1.介绍: UIBezierPath :画贝塞尔曲线的path类 UIBezierPath定义 : 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度. 曲线的定义有四个点:起始点.终止点(也称锚点)以及两个相互分离的中间点. 滑动两个中间点,贝塞尔曲线的形状会发生变化. UIBezierPath :对象是CGPathRef数据类型的封装,可以方便的让我们画出 矩形 . 椭圆 或者 直线和曲线的组合形状 初始化方法: + (instancetype)bezierPath; /

折线图 饼状图 柱状图

xaml 文件 <Window x:Class="Supplier.TrendCharts" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="产品价格趋势图" Height="500" Width