ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 玄图 ## 需求 人口迁移展示数据如下: ``` javascript var city_name = [ "北京" , "上海" , "广州" , "深圳" , "香港" ]; var population = [ [ 1000, 3045 , 4567 , 1234 , 3714 ], [ 3214, 2000 , 2060 , 124 , 3234 ], [ 8761, 6545 , 3000 , 8045 , 647 ], [ 3211, 1067 , 3214 , 4000 , 1006 ], [ 2146, 1034 , 6745 , 4764 , 5000 ] ]; ``` ![](https://box.kancloud.cn/3610204d73db1c4e2dbf17b25f5a5a3f_494x472.png) ## d3.chord 使用布局器可以得到一组数据chrod ``` json source:{ index: 2, subindex: 0, startAngle: 1.8230785342635087, endAngle: 2.4832964178069363, value: 8761 } target:{ index: 0, subindex: 2, startAngle: 0.3048260859414638, endAngle: 0.6489894319228396, value: 4567 } ``` 这个很清晰,里面描述的是玄图中一个玄。 同时还有goups里面描述了外圈环的角度。其中一个 ``` json { index: 0, startAngle: 0, endAngle: 1.0218644562092087, value: 13560 } ``` 真实数据如下图 ![](https://box.kancloud.cn/ce9c900dd8f68b4c9d0ef1821db4bc95_825x422.png) 通过得到如上数据,接下来绘制就非常简单了 1.使用一组path绑定group数据,使用d3.arc来绘制环形。 2.使用一组path绑定chrod数据,使用d3.ribbon()来绘制中心的玄即可。 ## 绘制 ``` javascript //创建svg var svg = d3.select('#root') .append('svg') .attr('width', 600) .attr('height', 600) .style("background-color","rgb(142, 137, 137)"); var margin=[100,100,100,100] //模拟数据: var city_name = ["北京","上海","广州","深圳","香港"]; var population = [ [ 1000, 3045 , 4567 , 1234 , 3714 ], [ 3214, 2000 , 2060 , 124 , 3234 ], [ 8761, 6545 , 3000 , 8045 , 647 ], [ 3211, 1067 , 3214 , 4000 , 1006 ], [ 2146, 1034 , 6745 , 4764 , 5000 ] ]; //处理数据得到适合绘图数据 var chrodes = d3.chrod()(population) //构建颜色比例尺 var color = d3.scaleOrdinal(d3.schemeCategory20) //创建分组 var rootG = svg.append('g').attr('class','rootG') .attr('transform','translate(300,300)') var groupG = rootG.append('g').attr('class','group') var chrodG = rootG.append('g').attr('class','chrodes') //创建绘制器 var arc = d3.arc() .innerRadius(240) .outerRadius(270) var ribbon = d3.ribbon() .radius(240) //绘制 groupG.selectAll("path") .data(chrodes['groups']) .enter() .append('path') .attr("fill", function (d, i) { return color(i) }) .attr('d',arc) chrodG.selectAll('path') .data(chrodes) .enter() .append('path') .attr("fill", function (d, i) { return color(i) }) .attr('d',ribbon) ``` ## 实例 无交互[chord0](https://doter1995.github.io/d3-start-course/chrod/chrod-0.html) ![](https://box.kancloud.cn/c8ff456ec4e2029b1ffea8063d397b39_566x584.png)