当前位置:   article > 正文

d3-V5 力引导布局实例图_d3设置力引导布局宽高设置

d3设置力引导布局宽高设置

环境vue组件中 

  1. <template>
  2. <div>
  3. <svg width="960" height="600"></svg>
  4. </div>
  5. </template>
  6. <script>
  7. /* eslint-disable no-param-reassign */
  8. import * as d3 from 'd3';
  9. // 准备数据
  10. const nodes = [
  11. { id: '湖南邵阳', group: '头晕' },
  12. { id: '山东莱州', group: '头晕' },
  13. { id: '广东阳江', group: '体征' },
  14. { id: '山东枣庄', group: '部位' },
  15. { id: '泽', group: '头晕' },
  16. { id: '恒', group: '体征' },
  17. { id: '鑫', group: '部位' },
  18. { id: '明山', group: '头晕' },
  19. { id: '班长', group: '体征' },
  20. ];
  21. const leng = [
  22. { group: '头晕' },
  23. { group: '部位' },
  24. { group: '体征' },
  25. ];
  26. const edges = [
  27. { source: '湖南邵阳', target: '山东莱州' },
  28. { source: '山东莱州', target: '广东阳江' },
  29. { source: '山东枣庄', target: '泽' },
  30. { source: '明山', target: '泽' },
  31. { source: '班长', target: '明山' },
  32. { source: '明山', target: '泽' },
  33. { source: '恒', target: '鑫' },
  34. { source: '广东阳江', target: '班长' },
  35. { source: '恒', target: '泽' },
  36. { source: '明山', target: '班长' },
  37. ];
  38. const colorScale = d3.scaleOrdinal(d3.schemeCategory10);
  39. // 新建一个力导向图
  40. const forceSimulation = d3.forceSimulation()
  41. .force('link', d3.forceLink().id(d => d.id))
  42. .force('charge', d3.forceManyBody())
  43. .force('center', d3.forceCenter());
  44. export default {
  45. data() {
  46. return {
  47. links: '',
  48. linksText: '',
  49. gs: '',
  50. };
  51. },
  52. mounted() {
  53. const marge = { top: 60, bottom: 60, left: 60, right: 60 };
  54. const svg = d3.select('svg');
  55. const width = svg.attr('width');
  56. const height = svg.attr('height');
  57. const g = svg.append('g')
  58. .attr('transform', `translate(${marge.top},${marge.left})`);
  59. svg.call(
  60. d3.zoom()
  61. .scaleExtent([0.1, 4])
  62. .on('zoom', () => { g.attr('transform', d3.event.transform); }),
  63. );
  64. svg.selectAll('rect')
  65. .data(leng)
  66. .enter()
  67. .append('rect')
  68. .attr('x', (d, i) => i * 70)
  69. .attr('y', 20)
  70. .attr('class', 'legend')
  71. .attr('width', 25)
  72. .attr('height', 15)
  73. .attr('rx', 4)
  74. .attr('ry', 4)
  75. .style('fill', d => colorScale(d.group));
  76. svg.selectAll('.text')
  77. .data(leng)
  78. .enter()
  79. .append('text')
  80. .attr('class', 'Text')
  81. .attr('x', (d, i) => 25 + i * 70)
  82. .attr('y', 32)
  83. .attr('transform', 'translate(5)')
  84. .text(d => d.group);
  85. forceSimulation.nodes(nodes)
  86. .on('tick', this.ticked);// 这个函数很重要,后面给出具体实现和说明
  87. // 生成边数据
  88. forceSimulation.force('link')
  89. .links(edges)
  90. .distance(() => 200);
  91. // 设置图形的中心位置
  92. forceSimulation.force('center')
  93. .x(width / 2)
  94. .y(height / 2);
  95. // 在浏览器的控制台输出
  96. console.log(nodes);
  97. console.log(edges);
  98. // 有了节点和边的数据后,我们开始绘制
  99. // 绘制边
  100. this.links = g.append('g')
  101. .selectAll('line')
  102. .data(edges)
  103. .enter()
  104. .append('line')
  105. .attr('stroke', '#ccc')
  106. .attr('stroke-width', 1);
  107. // 绘制节点
  108. // 老规矩,先为节点和节点上的文字分组
  109. this.gs = g.selectAll('.circleText')
  110. .data(nodes)
  111. .enter()
  112. .append('g')
  113. .attr('transform', (d) => {
  114. const cirX = d.x;
  115. const cirY = d.y;
  116. return `translate(${cirX},${cirY})`;
  117. })
  118. .call(d3.drag()
  119. .on('start', this.started)
  120. .on('drag', this.dragged)
  121. .on('end', this.ended));
  122. // 绘制节点
  123. this.gs.append('circle')
  124. .attr('class', 'hover')
  125. .attr('r', 15)
  126. .attr('fill', d => colorScale(d.group))
  127. .on('mouseover', function () {
  128. d3.select(this)
  129. .attr('r', 17)
  130. .attr('stroke', '#D3D3D3')
  131. .attr('stroke-width', 1);
  132. })
  133. .on('mouseout', function () {
  134. d3.select(this)
  135. .transition()
  136. .duration(300)
  137. .attr('fill', d => colorScale(d.group))
  138. .attr('r', 15)
  139. .attr('stroke', 'none');
  140. });
  141. // 文字
  142. this.gs.append('text')
  143. .attr('x', -15)
  144. .attr('y', -28)
  145. .attr('dy', 10)
  146. .attr('fill', d => colorScale(d.group))
  147. .text(d => d.id);
  148. },
  149. methods: {
  150. ticked() {
  151. this.links
  152. .attr('x1', d => d.source.x)
  153. .attr('y1', d => d.source.y)
  154. .attr('x2', d => d.target.x)
  155. .attr('y2', d => d.target.y);
  156. this.gs
  157. .attr('transform', d => `translate(${d.x},${d.y})`);
  158. },
  159. started(d) {
  160. if (!d3.event.active) {
  161. forceSimulation.alphaTarget(0.8).restart();
  162. }
  163. d.fx = d.x;
  164. d.fy = d.y;
  165. },
  166. dragged(d) {
  167. d.fx = d3.event.x;
  168. d.fy = d3.event.y;
  169. },
  170. ended(d) {
  171. if (!d3.event.active) {
  172. forceSimulation.alphaTarget(0);
  173. }
  174. d.fx = null;
  175. d.fy = null;
  176. },
  177. },
  178. };
  179. </script>
  180. <style scoped>
  181. .title { background: red;}
  182. .text{ font-size: 12px;}
  183. .hover:hover{ border: 5px solid #ccc;}
  184. .legend {
  185. position: fixed;
  186. font: 10px sans-serif;
  187. box-shadow: 2px 2px 1px #888;
  188. }
  189. </style>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/132781
推荐阅读
相关标签
  

闽ICP备14008679号