http://blog.csdn.net/tianxuzhang/article/details/14149681

弦图

鼠标悬停效果:

(1)指定圆环和玄的数值

[javascript] view plaincopy
  1. var matrix = [
  2. [0,  5871, 8916, 2868],//每组是一个部分圆环,数值是其中的玄的大小
  3. [ 1951, 10048, 2060, 6171],
  4. [ 8010, 16145,  0, 8045],
  5. [ 1013,   990,  940, 6907]
  6. ];<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

(2)初始化玄

[javascript] view plaincopy
  1. var chord = d3.layout.chord()//chord使用后可以返回两个东东:chord.groups跟chord.chords
  2. .padding(.05)//padding是圆环上每个部分之间的距离
  3. .sortSubgroups(d3.descending)//sortSubgroups 传入一个function,这个function规定了每一行中的元素的排列顺序。同样也有sortGroups 这个是规定行的排列顺序
  4. .matrix(matrix);//可以给chord绑定数据,并根据数据进行分割

(3)为部分圆环添加path并添加鼠标事件

(注意之后加上玄后也会被此事件覆盖)

[javascript] view plaincopy
  1. svg.append("g").selectAll("path")
  2. .data(chord.groups)//通过chord.groups可以把圆环按照数据分组,即一个圆环一组
  3. .enter().append("path")
  4. .style("fill", function(d) { return fill[d.index] })//圆环中第几个玄
  5. .style("stroke", function(d) { return fill[d.index]; })
  6. .attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius))//画圆环
  7. .on("mouseover", fade(.1))//为path添加鼠标事件
  8. .on("mouseout", fade(1));
  9. // 阴影函数
  10. function fade(opacity) {
  11. return function(g, i) {
  12. svg.selectAll(".chord path")
  13. .filter(function(d) { //过滤器,过滤掉没选中的
  14. return d.source.index != i && d.target.index != i;
  15. })
  16. .transition()//过渡
  17. .style("opacity", opacity);//不透明度
  18. };
  19. }

(4)弦生成器

[javascript] view plaincopy
  1. svg.append("g")
  2. .attr("class", "chord")
  3. .selectAll("path")
  4. .data(chord.chords)//创造“弦”de参数
  5. .enter().append("path")
  6. .attr("d", d3.svg.chord()//弦生成器,他通过接受一系列的参数来创造“弦”也就是图形的条带。而这些参数又可以利用chord.chords生成
  7. .radius(innerRadius))//指定内径
  8. .style("fill", function(d) { return fill[d.target.index]; })//玄链接两个圆环节点,得到她的编号
  9. .style("opacity", 1);//不透明度

chords参数:

(5)刻度函数

[javascript] view plaincopy
  1. function groupTicks(d) {
  2. var k = (d.endAngle - d.startAngle) / d.value;//把圆环平均化,以便于后面乘上每个
  3. console.log(k);
  4. return d3.range(0, d.value, 1000).//起点 终点 分隔段大小
  5. map(function(v, i) {//首先创建一个刻度的数组,map遍历之
  6. return {
  7. angle: v * k //一刻度的长度
  8. + d.startAngle,//加完上面偏移量得到最终坐标
  9. label: i % 5 ? null : v / 1000 + "k"//每个5个刻度标记一下
  10. };
  11. });
  12. }

(6)刻度

[javascript] view plaincopy
  1. var ticks = svg.append("g").selectAll("g")
  2. .data(chord.groups)第一次分组,依据是chord.groups 圆环分组
  3. .enter().append("g").selectAll("g")
  4. .data(groupTicks)//第二次分组,依据是刻度对象
  5. .enter().append("g")
  6. .attr("transform", function(d) {//对刻度进行旋转变换 这里标记一下以后研究
  7. return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
  8. + "translate(" + outerRadius + ",0)";
  9. });
  10. ticks.append("line")//加刻度线
  11. .attr("x1", 1)
  12. .attr("y1", 0)
  13. .attr("x2", 5)
  14. .attr("y2", 0)
  15. .style("stroke", "#000");

(7)添加刻度文字

这里标记一下以后研究

[javascript] view plaincopy
  1. ticks.append("text")
  2. .attr("x", 8)
  3. .attr("dy", ".35em")
  4. .attr("transform", function(d) { return d.angle > Math.PI ? "rotate(180)translate(-16)" : null; })
  5. .style("text-anchor", function(d) { return d.angle > Math.PI ? "end" : null; })
  6. .text(function(d) { return d.label; });<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">   </span>
[html] view plaincopy
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>testD3-25-chord.html</title>
  6. <script type="text/javascript" src="http://localhost:8080/spring/js/d3.v3.js"></script>
  7. <style>
  8. body {
  9. font: 10px sans-serif;
  10. }
  11. .chord path {
  12. fill-opacity: .67;
  13. stroke: #000;
  14. stroke-width: .5px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <script type="text/javascript">
  20. //(1)指定圆环和玄的数值
  21. var matrix = [
  22. [0,  5871, 8916, 2868],//每组是一个部分圆环,数值是其中的玄的大小
  23. [ 1951, 10048, 2060, 6171],
  24. [ 8010, 16145,  0, 8045],
  25. [ 1013,   990,  940, 6907]
  26. ];
  27. var width = 960,
  28. height = 500,
  29. innerRadius = Math.min(width, height) * .41,
  30. outerRadius = innerRadius * 1.1;
  31. //颜色数组
  32. var fill =["#000000", "#FFDD89", "#957244", "#F26223"];
  33. var svg = d3.select("body").append("svg")
  34. .attr("width", width)
  35. .attr("height", height)
  36. .append("g")
  37. .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");//因为圆形绘制的时候是以原点为中心绘制的,而我们的图形原点现在在左上角,所以会出现一个问题就是左边跟上边的图表部分会看不到。因此我们使用translate属性来位移一下即可
  38. //(2)初始化玄
  39. var chord = d3.layout.chord()//chord使用后可以返回两个东东:chord.groups跟chord.chords
  40. .padding(.05)//padding是圆环上每个部分之间的距离
  41. .sortSubgroups(d3.descending)//sortSubgroups 传入一个function,这个function规定了每一行中的元素的排列顺序。同样也有sortGroups 这个是规定行的排列顺序
  42. .matrix(matrix);//可以给chord绑定数据,并根据数据进行分割
  43. //(3)为部分圆环添加path并添加鼠标事件(注意之后加上玄后也会被此事件覆盖)
  44. svg.append("g").selectAll("path")
  45. .data(chord.groups)//通过chord.groups可以把圆环按照数据分组,即一个圆环一组
  46. .enter().append("path")
  47. .style("fill", function(d) { return fill[d.index] })//圆环中第几个玄
  48. .style("stroke", function(d) { return fill[d.index]; })
  49. .attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius))//画圆环
  50. .on("mouseover", fade(.1))//为path添加鼠标事件
  51. .on("mouseout", fade(1));
  52. // 阴影函数
  53. function fade(opacity) {
  54. return function(g, i) {
  55. svg.selectAll(".chord path")
  56. .filter(function(d) { //过滤器,过滤掉没选中的
  57. return d.source.index != i && d.target.index != i;
  58. })
  59. .transition()//过渡
  60. .style("opacity", opacity);//不透明度
  61. };
  62. }
  63. //(4)弦生成器
  64. svg.append("g")
  65. .attr("class", "chord")
  66. .selectAll("path")
  67. .data(chord.chords)//创造“弦”de参数
  68. .enter().append("path")
  69. .attr("d", d3.svg.chord()//弦生成器,他通过接受一系列的参数来创造“弦”也就是图形的条带。而这些参数又可以利用chord.chords生成
  70. .radius(innerRadius))//指定内径
  71. .style("fill", function(d) { return fill[d.target.index]; })//玄链接两个圆环节点,得到她的编号
  72. .style("opacity", 1);//不透明度
  73. //(6)刻度
  74. var ticks = svg.append("g").selectAll("g")
  75. .data(chord.groups)第一次分组,依据是chord.groups 圆环分组
  76. .enter().append("g").selectAll("g")
  77. .data(groupTicks)//第二次分组,依据是刻度对象
  78. .enter().append("g")
  79. .attr("transform", function(d) {//对刻度进行旋转变换 这里标记一下以后研究
  80. return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
  81. + "translate(" + outerRadius + ",0)";
  82. });
  83. ticks.append("line")//加刻度线
  84. .attr("x1", 1)
  85. .attr("y1", 0)
  86. .attr("x2", 5)
  87. .attr("y2", 0)
  88. .style("stroke", "#000");
  89. //(7)添加刻度文字  这里标记一下以后研究
  90. ticks.append("text")
  91. .attr("x", 8)
  92. .attr("dy", ".35em")
  93. .attr("transform", function(d) { return d.angle > Math.PI ? "rotate(180)translate(-16)" : null; })
  94. .style("text-anchor", function(d) { return d.angle > Math.PI ? "end" : null; })
  95. .text(function(d) { return d.label; });
  96. //(5)刻度函数
  97. function groupTicks(d) {
  98. var k = (d.endAngle - d.startAngle) / d.value;//把圆环平均化,以便于后面乘上每个
  99. console.log(k);
  100. return d3.range(0, d.value, 1000).//起点 终点 分隔段大小
  101. map(function(v, i) {//首先创建一个刻度的数组,map遍历之
  102. return {
  103. angle: v * k //一刻度的长度
  104. + d.startAngle,//加完上面偏移量得到最终坐标
  105. label: i % 5 ? null : v / 1000 + "k"//每个5个刻度标记一下
  106. };
  107. });
  108. }
  109. </script>
  110. </body>
  111. </html>

【D3.js数据可视化系列教程】(二十八)--弦图相关推荐

  1. 【D3.js数据可视化系列教程】(三十六)-- 冰柱图

    1. 冰柱图简介 冰柱图使用D3的分区布局实现,主要用来展现数据的层次和包含关系.实际上使用笛卡尔排列的分区布局数据绘制的就是冰柱图,径向排列就是旭日图. 下图给出的是笛卡尔排列方式. 2. 冰柱图示 ...

  2. 【D3.js数据可视化系列教程】(三十四)-- sankey图

    好多没看懂.先把理解的放着吧 <!DOCTYPE html> <head> <meta charset="utf-8"> <title&g ...

  3. c语言数组统计条形图,【D3.js数据可视化系列教程】--(十)更自由的条形图

    1. 准备数据 绘制条形图的输入数只需要一个表示每个条数据量的数组就行. var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13,11, 12, 1 ...

  4. 数据可视化系列(二):艺术画笔见乾坤

    前言 期待了好久的datawhale可视化教程终于出来了,这次标题狠有文艺范儿,哈哈哈 这次我主要目的是最近要写篇论文,也正好为以后建模画图打劳基础~ 大家可以多看看官方教程: 中文官方网站:http ...

  5. 《D3.js数据可视化实战手册》——2.5 使用子选择器

    本节书摘来异步社区<D3.js数据可视化实战手册>一书中的第2章,第2.5节,作者: [加拿大]Nick Qi Zhu,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  6. 《D3.js数据可视化实战手册》—— 1.1 简介

    本节书摘来异步社区<D3.js数据可视化实战手册>一书中的第1章,第1.1节,作者: [加拿大]Nick Qi Zhu,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  7. kafka maven 依赖_SpringBoot入门建站全系列(二十八)整合Kafka做日志监控

    SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...

  8. SpringBoot入门建站全系列(二十八)整合Kafka做日志监控

    SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...

  9. 强化学习系列文章(二十八):进化强化学习EvoRL的预实验

    强化学习系列文章(二十八):进化强化学习EvoRL的预实验 最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下.进化算法也常用于优化神经网络的参数,C ...

最新文章

  1. Android中文API (110) —— CursorTreeAdapter
  2. c# SQLServer导入大批量数据
  3. nginx内存占用高---内存池使用思考
  4. 你所知道及不知道的骗贷、中介、欺诈团伙是怎么样的
  5. [读书笔记][golang]《go语言-云动力》
  6. linux sd卡 读写速度测试_铠侠(原东芝存储)SD卡,大容量存储时代,高速读写选择...
  7. android四周阴影效果_帮助独立开发者轻松创建令人惊叹的产品视觉效果
  8. 嵌入式CANopen协议从入门到落地产品(更新2021.9.8)
  9. 入门篇:函数计算中角色和访问策略的讲解
  10. oracle为表空间增加数据文件_只读数据文件损坏恢复实验记录
  11. Perl的模块判断及安装
  12. 多线程之线程范围内的数据共享ThreadLocal
  13. A1 A2 B1 B2 英语分级单词 汇总
  14. python绘制太阳花_Python绘制蟒蛇和太阳花
  15. 用scratch编程打字游戏
  16. python怎么设置随机数种子_Pytorch在dataloader类中设置shuffle的随机数种子方式
  17. 2016年7月的数据省市区数据
  18. 二叉树的操作--递归与非递归
  19. 荣耀note10无缘鸿蒙,赵明确认荣耀NOTE10 真机参数疑似全曝光!
  20. python入门小项目 | 开发一个《小猫抓鱼》小游戏

热门文章

  1. 云队友丨直面真问题,找到根本解:如何有效解决问题?
  2. 【论文阅读】Interpretable Visual Reasoning via Probabilistic Formulation under Natural Supervision
  3. 阿里云RocketMQ
  4. 一盆惨遭毒手的肉——记,那一次和小鲜肉的邂逅
  5. 2019电赛总结(一)
  6. js控制蓝牙笔翻页功能(键盘事件)
  7. 模型训练之决策树、随机森林、提升树
  8. eclipse 插件安装 摘要
  9. MSF:Web 后门
  10. NTP(网络时间协议)学习