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

  本人的个人博客为: www.ourd3js.com 

    csdn博客为: blog.csdn.net/lzhlzz 

    转载请注明出处,谢谢。


    这一节用 Layout 做一个饼状图。第9节中说过, Layout 的作用只是转换数据,将不适合图形化的数据转化成适合图形化的数据。现在使用以下数据:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var dataset = [ 30 , 10 , 43 , 55 , 13 ];  

    这个数据要不能直接用于画饼状图,我们必须通过计算将它转换成角度。这个计算不需要我们手动计算,因为 D3 中提供了 d3.layout.pie() 函数,这个 Layout 就是用于将上面这样的数据转换成饼状图需要的角度。下面定义一个这样的函数。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var pie = d3.layout.pie();  
    一定要记住,这是一个 函数 ,使用它的时候,要 pie( dataset ) 这样才转换数据。我们可以先看看转换后输出什么样的数据。

    如上图所示,5个整数被转换成了5个 Object ,每个里面存有起始角度结束角度,以及原整数。这样的数据适合做饼状图,这就是 Layout 的作用。但是要注意,实际作图时,还是需要别的作图方法的。

    我们可用做弧线的方法来作饼状图,因为弧线有粗细,调整粗细就能变成饼状图,下面我们添加如下代码:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var outerRadius = width / 2;  
  2.         var innerRadius = width / 4;  
  3.         var arc = d3.svg.arc()  
  4.                         .innerRadius(innerRadius)  
  5.                         .outerRadius(outerRadius);  
    outerRadius 和 innerRadius 是弧线的外半径和内半径,width 是 svg 绘制框的宽度, outerRadius - innerRadius 就是弧线的粗细。然后我们定义一个弧线的函数 arc ,并把内外半径传给它。要注意 arc 也是一个 函数
    接下来可以作图了,和前几节一样,都是在 svg 框内作图。上面的有5个整数,也就是有5段弧线。我们先在 svg 里添加5个分组( 也就是 svg 中的元素 g )。每一个分组就是一段弧线。代码如下:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var arcs = svg.selectAll("g")  
  2.               .data(pie(dataset))  
  3.               .enter()  
  4.               .append("g")  
  5.               .attr("transform","translate("+outerRadius+","+outerRadius+")");  
    上面的代码中,我们绑定了转换后的数据 pie(dataset) ,有5个数据,所以会添加5个g元素,最后一行代码是移动元素的位置,默认的起始位置是 svg 绘制框的 (0,0) 坐标,也就是左上角。要注意,这个时候上面代码返回的是 同时选择5个g元素的选择。

   接下来对每个g元素,添加 path 。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. arcs.append("path")  
  2.     .attr("fill",function(d,i){  
  3.         return color(i);  
  4.     })  
  5.     .attr("d",function(d){  
  6.         return arc(d);  
  7.     });  
    因为 arcs 是同时选择5个g元素的,所以 append("pah") 后,是每一个 g 中都有 path ,然后再添加颜色属性,和路径属性。颜色属性的 color(i) 是定义的一个函数。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var color = d3.scale.category10();  
    SVG 中的路径属性是 d, 它的值是 arc(d) ,也就是将绑定的数据作为上面定义的函数 arc 的参数算出的值。

    接下来在每一个弧线中心添加文本。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. arcs.append("text")  
  2.     .attr("transform",function(d){  
  3.         return "translate(" + arc.centroid(d) + ")";  
  4.     })  
  5.     .attr("text-anchor","middle")  
  6.     .text(function(d){  
  7.         return d.value;  
  8.     });  
    arc.centroid(d) 能算出弧线的中心,要注意一句代码,返回的是 d.value ,而不是 d,因为当前绑定的数据是 Object,里面有起始角度等值,d.value 是元整数的值,可见上面的截图。

    好了,看看结果图吧。


完整代码如下:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <html>    
  2.   <head>    
  3.         <meta charset="utf-8">    
  4.         <title>Pie</title>    
  5.   </head>   
  6.   
  7. <style>  
  8.   
  9.   
  10. </style>  
  11.     <body>    
  12.         <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>    
  13.         <script>  
  14.           
  15.         var width = 600;  
  16.         var height = 600;  
  17.         var dataset = [ 30 , 10 , 43 , 55 , 13 ];  
  18.           
  19.         var svg = d3.select("body").append("svg")  
  20.                                 .attr("width",width)  
  21.                                 .attr("height",height);  
  22.           
  23.         var pie = d3.layout.pie();  
  24.           
  25.         var outerRadius = width / 2;  
  26.         var innerRadius = width / 4;  
  27.         var arc = d3.svg.arc()  
  28.                         .innerRadius(innerRadius)  
  29.                         .outerRadius(outerRadius);  
  30.           
  31.         var color = d3.scale.category10();  
  32.           
  33.         var arcs = svg.selectAll("g")  
  34.                       .data(pie(dataset))  
  35.                       .enter()  
  36.                       .append("g")  
  37.                       .attr("transform","translate("+outerRadius+","+outerRadius+")");  
  38.                         
  39.         arcs.append("path")  
  40.             .attr("fill",function(d,i){  
  41.                 return color(i);  
  42.             })  
  43.             .attr("d",function(d){  
  44.                 return arc(d);  
  45.             });  
  46.           
  47.         arcs.append("text")  
  48.             .attr("transform",function(d){  
  49.                 return "translate(" + arc.centroid(d) + ")";  
  50.             })  
  51.             .attr("text-anchor","middle")  
  52.             .text(function(d){  
  53.                 return d.value;  
  54.             });  
  55.           
  56.         console.log(dataset);  
  57.         console.log(pie(dataset));  
  58.             
  59.         </script>    
  60.           
  61.     </body>    
  62. </html>    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值