d3.layout.bundle()

下图是航班查询网站全球航班雷达(FlightRadar24)显示的今日长三角地区的飞机飞行图:

图中我们能看到每时每刻有多少飞行在我们头上飞,有北京-杭州、杭州-日本、上海-北京的航班等等,如果你想知道哪个机场最繁忙,那就可以用到捆图来展现了;

捆图(Bundle)是D3布局中即简单又复杂的一种布局方式,说简单,它只有2个函数来实现数据转换,说复杂,它的实现需要结合其它层级布局来实现,如:集群图、打包图、分区图、树状图、矩阵树图。最常见的是与集群图一起使用,使用集群图布局计算节点的位置,再用捆图布局计算连线路径。也就是说,捆图布局只干一件事:计算连线的路径。

在网上能找到的捆图示例较少,可以参见官方的示例:http://bl.ocks.org/mbostock/1044242

本文我们用通俗的方式来讲解捆图的用法;

1、数据

    // 城市列表var cities = {name: '',children: [{name: "北京"},{name: "昆明"},{name: "成都"},{name: "西安"},{name: "上海"},{name: "杭州"},{name: "广州"},{name: "桂林"},{name: "太原"},{name: "美国"}]};// 航班路线var railway = [{source: "美国", target: "上海"},{source: "北京", target: "上海"},{source: "北京", target: "广州"},{source: "北京", target: "杭州"},{source: "美国", target: "杭州"},{source: "北京", target: "西安"},{source: "北京", target: "成都"},{source: "美国", target: "北京"},{source: "北京", target: "太原"},{source: "北京", target: "桂林"},{source: "北京", target: "昆明"},{source: "北京", target: "成都"},{source: "上海", target: "杭州"},{source: "昆明", target: "成都"},{source: "西安", target: "太原"}];

2、数据转换

    var width = 500;var height = 500;// 需要一个方法将航班路线数据跟城市列表数据对接起来var map = function ( nodes, links ){var hash = [];for(var i = 0; i < nodes.length; i++){hash[nodes[i].name] = nodes[i];}var resultLinks = [];for(var i = 0; i < links.length; i++){resultLinks.push({source: hash[ links[i].source ],target: hash[ links[i].target ]});}return resultLinks;}// 分别创建一个集群图布局和一个捆图布局,360表示角度,width/2 - 50 表示捆图圆半径var cluster = d3.layout.cluster().size([360, width/2 - 50])var bundle = d3.layout.bundle();var nodes = cluster.nodes(cities);var oLinks = map(nodes, railway);var links = bundle(oLinks);

转换后的数据如图所示。

nodes - 节点

oLinks - 路线与城市对接后的数据

links - 捆图线条数据

3、绘制图形

生成SVG容器

    var svg = d3.select('body').append('svg').attr('width',width).attr('height',height)

创建径向折线SVG生成器

    var line = d3.svg.line.radial().interpolate("bundle") //在line.interpolate()所预定义的插值模式中,有一种就叫做bundle,正是为捆图准备的。.radius(function(d) { return d.y; }).angle(function(d) { return d.x / 360 * 2 * Math.PI; });

生成捆图容器

    var gBundle = svg.append("g").attr("transform", "translate(" + (width/2) + "," + (height/2) + ")");

颜色比例尺

var color = d3.scale.category20c();

生成连线路径

    var link = gBundle.selectAll(".link").data(links).enter().append("path").classed('link',true).style({'fill': 'none','stroke': 'rgba(0,0,0,0.5)','stroke-width': 5}).attr("d", line);

生成城市节点容器

    var node = gBundle.selectAll('.node').data( nodes.filter(function(d) { return !d.children; }) ) //排除数据中最顶层的空数据.enter().append('g').classed('node',true).attr("transform", function(d) {return "rotate(" + (d.x- 90) + ") translate("+ d.y + ")"; //这里为什么是d.x- 90,我也还不明白,暂先用着,后续再深入了解});

在节点容器中创建圆形和文本

    node.append('circle').attr('r',20).attr('fill', function(d,i){return color(i);})node.append('text').attr('dy','0.2em').style("text-anchor", "middle").text(function(d,i){return d.name;})

查看在线演示

【D3.js 学习总结】20、D3布局-捆图相关推荐

  1. 第一篇博客 赶鸭子上架的d3.js学习笔记(bilibili从零开始画图表学习笔记 感谢万能的b站以及up睿小狼d)

    svg: 可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图片格式.他由万维网联盟制定,是一个开放标准.(源代码类似于html) 一个简单的代码 <svg ...

  2. d3.js学习笔记--Mike Bostock: Thinking with Joins

    为什么80%的码农都做不了架构师?>>>    我们可以使用append方法, 来创建一个单一元素: var svg = d3.select('svg'),d = {"x& ...

  3. d3.js html显示图片,d3.js v4:如何在鼠标点击节点后显示图像

    在使用d3.js时仍然相当缺乏经验,我碰到了一个障碍. 希望有人能帮助我.d3.js v4:如何在鼠标点击节点后显示图像 我试图在鼠标单击图形中的节点时显示图片. 理想情况下,我想单击几个节点并显示图 ...

  4. 【D3.js 学习总结】12、D3布局-集群图

    d3.layout.cluster() 集群图是一种用于表示包含与被包含关系的图表. 集群图(Cluster)的API说明 cluster.children - 取得或者设置子节点的访问器函数. cl ...

  5. 【D3.js 学习总结】26、D3地理地图

    d3.geo 在学习D3如何制作地图前,我们需要了解下地图的数据格式geoJSON,GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式. ...

  6. D3.js学习(四)

    上一节我们已经学习了线条样式和格栅的绘制,在这一节中我们将要根据之前绘制的线条对图表进行填充,首先来看一下我们的目标吧 在这个图表中,我们对位于线条下面的空间进行了填充,那么,如何改做到呢? 设置填充 ...

  7. D3.js学习指北--第二章,基础复习

    D3学习指北–第二章,基础复习 1.关于html的svg标签   html5里有很多个标签,但是关于D3的应用多用在一个标签上< svg >svg标签可以理解为一个绘画板,里面提供了各类的 ...

  8. d3.js学习笔记②搭建服务器(含报错解决)

    强烈建议自己搭建一个服务器,否则在后续往js里导入本地数据(比如csv.json文件等)的时候会报错.我用的是Apache服务器,下载.安装过程参考这篇文章:Apache安装配置 在浏览器输入http ...

  9. d3.js画金庸小说力导向图

    以<连城诀>为例: 结果图: 人物和关系如下: .nodetext {font-size: 18px ;font-family: SimSun;fill:#000000; }.linete ...

  10. d3.js(v5.7)树状图

    一.新建画布 二.数据处理 三.绘制连接线 图示: 四.绘制节点.文字 图示: 五.总结 path元素:其实就是定义了绘图的坐标点,从哪开始,移动到哪,怎样移动(命令) 具体可百度(或许以后我会总结一 ...

最新文章

  1. 创建采购申请---BAPI_REQUISITION_CREATE
  2. python 风玫瑰图_python之windrose风向玫瑰图的用法
  3. fpga 峰值采样_FPGA开发者都喜欢用的通用高性能电源解决方案
  4. 成立烘焙公司、买茶饮 瑞幸咖啡谋变破局
  5. 关于url路径的定义方式
  6. vue强制刷新组件_强制Vue重新渲染组件的方法
  7. 华为HCIA认证考试题库数量有多少?HCIA备考时间多久合适?
  8. 唐诗三百首加密软件如何使用_绿盾加密软件如何设置审批流程管理
  9. 使命、愿景、价值观到底有什么区别
  10. 如何建立一个快速显示桌面的快捷方式?
  11. 计算机内存条属于什么电路,电脑主板内存供电电路介绍
  12. 助力奈雪,发掘茶饮品牌元宇宙新玩法
  13. 通过java获取抖音用户主页信息(2020年9月)
  14. android 8 奕骆,这才是超级手机 奕骆6000mAh称霸全球 USB Type-C
  15. 显示和隐藏一个div的问题
  16. 伸展树(一) - 概念和C实现
  17. Android_001_校园APP_001_底部导航栏_Fragment_0
  18. golang中的rune类型
  19. 教你科学实施有氧运动
  20. 青瓷引擎打造HTML5游戏第一弹——《神奇的六边形》Part 4

热门文章

  1. Linux文件颜色所代表的含义
  2. IIS部署,发布网站
  3. 如何用Smartbi做数据可视化分析图表
  4. signature=4d7e0a8216b57730ec16fe4e5ae2b93f,dragonfly对接harbor拉取镜像没有走dragonfly问题
  5. mc查询服务器状态,MC 服务器 所有指令 急要
  6. LeetCode-121. 买卖股票的最佳时机(java)
  7. 计算机硕士伊利诺伊大学排名,伊利诺伊香槟计算机工程专业研究生排名
  8. Drupal独到的编程思想
  9. 完美解决织梦CMS加入lian666自动友情链接代码正常显示
  10. AltiumDesigner之Logo制作