一、饼状图

  在布局的应用中,最简单的就是饼状图。

1、数据

  有如下数据,需要可视化:

var dataset = [ 30 , 10 , 43 , 55 , 13 ];

  这样的值是不能直接绘图的。例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终止角度,这些值都不存在于数组 dataset 中。因此,需要用到布局,布局的作用就是:计算出适合于作图的数据。

2、布局(数据转换)

  定义一个布局:

var pie = d3.layout.pie();

  返回值赋给变量 pie,此时 pie 可以当做函数使用

var piedata = pie(dataset);

  将数组 dataset 作为 pie() 的参数,返回值给 piedata。如此一来:piedata 就是转换后的数据。简单吧,非常轻松就得到了。在控制台输出 piedata ,让我们来看看数据转换成什么了。

  如上图所示,5 个整数被转换成了 5 个对象(Object) ,每个对象都有变量起始角度(startAngle)和终止角度(endAngle),还有原数据(属性名称为 data)。这些都是绘图需要的数据。

  千万记住:布局不是要直接绘图,而是为了得到绘图所需的数据。

3、绘制图形

  为了根据转换后的数据 piedata 来作图,还需要一样工具:生成器

  SVG 有一个元素,叫做路径 <path>,是 SVG 中功能最强的元素,它可以表示其它任意的图形。顾名思义,路径元素就是通过定义一个段“路径”,来绘制出各种图形。但是,路径是很难计算的,通过布局转换后的数据 piedata 仍然很难手动计算得到路径值。为我们完成这项任务的,就是生成器。

  这里要用到的叫做弧生成器,能够生成弧的路径,因为饼图的每一部分都是一段弧。

var outerRadius = 150; //外半径
var innerRadius = 0; //内半径,为0则中间没有空白var arc = d3.svg.arc()  //弧生成器.innerRadius(innerRadius)   //设置内半径.outerRadius(outerRadius);  //设置外半径

  弧生成器返回的结果赋值给 arc。此时,arc 可以当做一个函数使用,把 piedata 作为参数传入,即可得到路径值。

  接下来,可以在 SVG 中添加图形元素了。先在 <svg> 里添加足够数量(5个)个分组元素(g),每一个分组用于存放一段弧的相关元素。

var arcs = svg.selectAll("g").data(piedata).enter().append("g").attr("transform","translate("+ (width/2) +","+ (width/2) +")");

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

arcs.append("path").attr("fill",function(d,i){return color(i);}).attr("d",function(d){return arc(d);   //调用弧生成器,得到路径值});

  因为 arcs 是同时选择了 5 个 <g> 元素的选择集,所以调用 append(“path”) 后,每个 <g> 中都有 <path> 。路径值的属性名称是 d,调用弧生成器后返回的值赋值给它。要注意,arc(d) 的参数 d 是被绑定的数据。

  另外,color 是一个颜色比例尺,它能根据传入的索引号获取相应的颜色值,定义如下。

var color = d3.scale.category10();   //有十种颜色的颜色比例尺

  然后在每一个弧线中心添加文本。

arcs.append("text").attr("transform",function(d){return "translate(" + arc.centroid(d) + ")";}).attr("text-anchor","middle").text(function(d){return d.data;});

  arc.centroid(d) 能算出弧线的中心

  要注意,text() 里返回的是 d.data ,而不是 d 。因为被绑定的数据是对象,里面有 d.startAngle、d.endAngle、d.data 等,其中 d.data 才是转换前的整数的值

二、力导向图

  力导向图中每一个节点都受到力的作用而运动,这种是一种非常绚丽的图表。

  力导向图(Force-Directed Graph),是绘图的一种算法。在二维或三维空间里配置节点,节点之间用线连接,称为连线。各连线的长度几乎相等,且尽可能不相交。节点和连线都被施加了力的作用,力是根据节点和连线的相对位置计算的。根据力的作用,来计算节点和连线的运动轨迹,并不断降低它们的能量,最终达到一种能量很低的安定状态。

  力导向图能表示节点之间的多对多的关系。

1、数据

  初始数据如下:

var nodes = [ { name: "桂林" }, { name: "广州" },{ name: "厦门" }, { name: "杭州" },{ name: "上海" }, { name: "青岛" },{ name: "天津" } ];var edges = [ { source : 0 , target: 1 } , { source : 0 , target: 2 } ,{ source : 0 , target: 3 } , { source : 1 , target: 4 } ,{ source : 1 , target: 5 } , { source : 1 , target: 6 } ];

  节点(nodes)和连线(edges)的数组,节点是一些城市名,连线的两端是节点的序号(序号从 0 开始)。

  这些数据是不能作图的,因为不知道节点和连线的坐标。这句话一说出来,就请想到布局。力导向图用到的布局是:d3.layout.force()

2、布局(数据转换)

  定义一个力导向图的布局如下

var force = d3.layout.force().nodes(nodes) //指定节点数组.links(edges) //指定连线数组.size([width,height]) //指定作用域范围.linkDistance(150) //指定连线长度.charge([-400]); //相互之间的作用力

  然后,使力学作用生效:

force.start();    //开始作用

  如此,数组 nodes 和 edges 的数据都发生了变化。在控制台输出一下,看看发生了什么变化。

  节点转换前后如下图

  转换后,节点对象里多了一些变量。其意义如下:

  • index:节点的索引号
  • px, py:节点上一个时刻的坐标
  • x, y:节点的当前坐标
  • weight:节点的权重

  再来看看连线的变化:

  可以看到,连线的两个节点序号,分别变成了对应的节点对象。(一个代表源,一个代表目标

3、绘制

  有了转换后的数据,就可以作图了。分别绘制三种图形元素:

  • line,线段,表示连线。
  • circle,圆,表示节点。
  • text,文字,描述节点。

  代码如下:

//添加连线 var svg_edges = svg.selectAll("line").data(edges).enter().append("line").style("stroke","#ccc").style("stroke-width",1);var color = d3.scale.category20();//颜色比例尺//添加节点 var svg_nodes = svg.selectAll("circle").data(nodes).enter().append("circle").attr("r",20).style("fill",function(d,i){return color(i);}).call(force.drag);  //使得节点能够拖动//添加描述节点的文字var svg_texts = svg.selectAll("text").data(nodes).enter().append("text").style("fill", "black").attr("dx", 20).attr("dy", 8).text(function(d){return d.name;});

  调用 call( force.drag ) 后节点可被拖动。force.drag() 是一个函数,将其作为 call() 的参数,相当于将当前选择的元素传到 force.drag() 函数中

  最后,还有一段最重要的代码。由于力导向图是不断运动的,每一时刻都在发生更新,因此,必须不断更新节点和连线的位置

  力导向图布局 force 有一个事件 tick,每进行到一个时刻,都要调用它,更新的内容就写在它的监听器里就好

force.on("tick", function(){ //对于每一个时间间隔//更新连线坐标svg_edges.attr("x1",function(d){ return d.source.x; }).attr("y1",function(d){ return d.source.y; }).attr("x2",function(d){ return d.target.x; }).attr("y2",function(d){ return d.target.y; });//更新节点坐标svg_nodes.attr("cx",function(d){ return d.x; }).attr("cy",function(d){ return d.y; });//更新文字坐标svg_texts.attr("x", function(d){ return d.x; }).attr("y", function(d){ return d.y; });});

  tick 的英文意思是钟表发出的嘀嗒嘀嗒声,每次触发时,都会调用后面的无名函数 function。

转载于:https://www.cnblogs.com/goloving/p/8611763.html

D3.js系列——布局:饼状图和力导向图相关推荐

  1. D3.js系列——布局:打包图和地图

    一.打包图 打包图( Pack ),用于表示包含与被包含的关系,也可表示各对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 1.布局(数据转换) var pack = d3.layout ...

  2. 在html中添加力导向图,echart力导向图的绘制

    import echarts from 'echarts'; export default { props: { value: String }, data () { return { list1: ...

  3. d3.js力导向图使用详解

    创建一个力导向图需要三个东西: 仿真模拟系统 节点 力 当然,一般我们也会创建links(边)来连接两个节点,例如上图 仿真模拟系统中存在多个节点和多种类型的力,通过力控制节点的运动,每个节点都在多个 ...

  4. D3 v3版本绘制力导向图更新节点时JS控制台报错 :Error: circle attribute cx: Expected length, NaN解决办法

    D3的v3版本,很古老了. 拿来绘制力导向图,画布初始化的代码如下: //代码不完整,仅作演示以说明问题 //节点数组var nodes = [ { name: "sssss" , ...

  5. D3.js 力导向图来处理拓扑图

    记录一点碰到的问题和解决方案.感觉国内关于D3.js 4.0版本的相关资料还是少. 力导向图布局 D3一种布局的方式,可以将你nodes links的节点数据转换成可以绘制的坐标点数据,然后通过svg ...

  6. D3.js实现力导向图(Dray和Zoom)

    今天遇到个问题就是把json(里面nodes和edges属性)文件通过D3.js展示出来,下午终于弄出来了,写篇博客记录一下. 先展示一下效果图: 放大后是这个效果: 什么是力导向图 D3.js官网: ...

  7. d3 svg path添加文本_D3.js 力导向图的显示优化

    D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...

  8. d3.js实现力导向图圈选框选

    #d3.js实现力导向图圈选框选 今天给大家带来的是如何在2D可视化图形中加入通过鼠标拖动圈选功能,以力导向图为例. ##最终效果 demo跳转 ##代码解析 我们是要在节点的上方绘制一个矩形覆盖节点 ...

  9. d3力导向图增加节点_d3.js力导向图节点如何都显示在边框内

    最近用到d3.js中的force力导向图,想实现效果如下,所有城市节点都在可视范围内,如果超出有滚动条也可以. 遇到的问题是,当节点一多,有的节点就会跑到外面去,这边是通过加大charge相互作用力, ...

最新文章

  1. iOS下bound,center和frame
  2. cookie追加数据_集算器 SPL 抓取网页数据
  3. SD-WAN和虚拟专用网之间有什么区别?虚拟专用网会被替代吗?
  4. 前端编码规范,个人感觉bootstrap总结的不错,拿出来给大家分享
  5. go test 如何输出到控制台_GO笔记之GO命令快速体验
  6. 您的WebApp真的需要jQuery吗?
  7. swiper鼠标hover停止自动轮播_swiper滑块组件
  8. 清华2020计算机系张晨,2020清华特奖入围名单公布:电子系学霸两篇顶会一作
  9. Linux内核实验作业七
  10. 构建安全驱动型网络,Fortinet荣誉2020 Gartner广域网边缘基础设施领导者的源力
  11. Qt中的对话框(模态,非模态,关于,问题,文件)
  12. android反编译工具 win8,Apk Easy Tool(android反编译工具)
  13. 汽车之家口啤数据爬虫
  14. NetBeans安装
  15. Windows远程桌面控制Ubuntu方法
  16. 项目整体管理:项目整体管理概述
  17. 泰森多边形(Voronoi diagram)
  18. 百度前端技术学院--零基础--第四天:背景边框列表链接和更复杂的选择器
  19. java研究所APP打开_Java是什么,学了我们能干什么?
  20. 为期五天的实训总结--Java Web

热门文章

  1. mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
  2. PHP内核贡献者,贡献者
  3. java gc 可达性_JAVA--GC 垃圾回收机制----可达性分析算法
  4. BUUCTF Web [极客大挑战 2019]EasySQL
  5. 组策略应用到本地安全策略
  6. 51信用卡微服务集成测试自动化探索
  7. postgresql基本使用(一)
  8. Windows Server 2008 R2托管服务账户(MSA)的功能
  9. PAT1023. 组个最小数
  10. PAT1060. 爱丁顿数