d32.html 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>testD3_chp15_1.html</title>
  5. <script type="text/javascript" src="http://d3js.org/d3.v5.min.js">
  6. </script>
  7. <meta charset="utf-8">
  8. <meta name="keywords" content="keyword1,keyword2,keyword3">
  9. <meta name="description" content="this is my page">
  10. <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  11. </head>
  12. <body>
  13. <svg width="960" height="600"></svg>
  14. <script>
  15. //定义边界
  16. var marge = {top:50, bottom:0, left:10, right:0};
  17. var svg = d3.select("svg");
  18. var width = svg.attr("width");
  19. var height = svg.attr("height");
  20. var g = svg.append("g")
  21. .attr("transform","translate("+marge.top+","+marge.left+")");
  22. var scale = svg.append("g")
  23. .attr("transform","translate("+marge.top+","+marge.left+")");
  24. //数据
  25. var dataset = {
  26. name:"中国",
  27. children:[
  28. {
  29. name:"浙江",
  30. children:[
  31. {name:"杭州" ,value:100},
  32. {name:"宁波",value:100},
  33. {name:"温州",value:100},
  34. {name:"绍兴",value:100}
  35. ]
  36. },
  37. {
  38. name:"广西",
  39. children:[
  40. {
  41. name:"桂林",
  42. children:[
  43. {name:"秀峰区",value:100},
  44. {name:"叠彩区",value:100},
  45. {name:"象山区",value:100},
  46. {name:"七星区",value:100}
  47. ]
  48. },
  49. {name:"南宁",value:100},
  50. {name:"柳州",value:100},
  51. {name:"防城港",value:100}
  52. ]
  53. },
  54. {
  55. name:"黑龙江",
  56. children:[
  57. {name:"哈尔滨",value:100},
  58. {name:"齐齐哈尔",value:100},
  59. {name:"牡丹江",value:100},
  60. {name:"大庆",value:100}
  61. ]
  62. },
  63. {
  64. name:"新疆" ,
  65. children:
  66. [
  67. {name:"乌鲁木齐"},
  68. {name:"克拉玛依"},
  69. {name:"吐鲁番"},
  70. {name:"哈密"}
  71. ]
  72. }
  73. ]
  74. };
  75. //创建一个hierarchy layout
  76. var hierarchyData = d3.hierarchy(dataset)
  77. .sum(function(d){
  78. return d.value;
  79. });
  80. //创建一个树状图
  81. var tree = d3.tree()
  82. .size([width-400,height-200])
  83. .separation(function(a,b){
  84. return (a.parent==b.parent?1:2)/a.depth;
  85. })
  86. //初始化树状图,也就是传入数据,并得到绘制树基本数据
  87. var treeData = tree(hierarchyData);
  88. console.log(treeData);
  89. //得到节点
  90. var nodes = treeData.descendants();
  91. var links = treeData.links();
  92. //输出节点和边
  93. console.log(nodes);
  94. console.log(links);
  95. //创建一个贝塞尔生成曲线生成器
  96. var Bézier_curve_generator = d3.linkHorizontal()
  97. .x(function(d) { return d.y; })
  98. .y(function(d) { return d.x; });
  99. //有了节点和边集的数据后,我们就可以开始绘制了,
  100. //绘制边
  101. g.append("g")
  102. .selectAll("path")
  103. .data(links)
  104. .enter()
  105. .append("path")
  106. .attr("d",function(d){
  107. var start = {x:d.source.x,y:d.source.y};
  108. var end = {x:d.target.x,y:d.target.y};
  109. return Bézier_curve_generator({source:start,target:end});
  110. })
  111. .attr("fill","none")
  112. .attr("stroke","yellow")
  113. .attr("stroke-width",1);
  114. //绘制节点和文字
  115. //老规矩,先创建用以绘制每个节点和对应文字的分组<g>
  116. var gs = g.append("g")
  117. .selectAll("g")
  118. .data(nodes)
  119. .enter()
  120. .append("g")
  121. .attr("transform",function(d){
  122. var cx = d.x;
  123. var cy= d.y;
  124. return "translate("+cy+","+cx+")";
  125. });
  126. //绘制节点
  127. gs.append("circle")
  128. .attr("r",6)
  129. .attr("fill","white")
  130. .attr("stroke","blue")
  131. .attr("stroke-width",1);
  132. //文字
  133. gs.append("text")
  134. .attr("x",function(d){
  135. return d.children?-40:8;
  136. })
  137. .attr("y",-5)
  138. .attr("dy",10)
  139. .text(function(d){
  140. return d.data.name;
  141. });
  142. </script>
  143. </body>
  144. </html>