D3力导向图添加点击时间

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
           
           .nodes g {
            cursor: move;
            }
            .link-text text {
            font-size: 14px;
            fill: #000;
            fill-opacity: 0;
            }
            .nodes text {
            font-weight: 700;
            }
            .links {
            stroke: #fff;
            }
            .links line {
            stroke: #ddd;
            }
        </style>
    </head>
    <body>
        <script src="https://d3js.org/d3.v4.min.js"></script>
        <script>
            var width=1000;
            height=1000;
        const data = {
      nodes: [
        { name: 'A人物' },
        { name: 'B人物' },
        { name: 'C人物' },
        { name: 'D人物' },
        { name: 'E人物' },
        { name: 'F人物' },
        { name: 'G人物' },
        { name: 'H人物' },
        { name: 'I人物' },
        { name: 'J人物' },
        { name: 'K人物' },
        { name: 'L人物' },
        { name: 'M人物' }
      ],
      edges: [
        // value越小关系越近
        { source: 0, target: 1, relation: '朋友', value: 3 },
        { source: 0, target: 2, relation: '朋友', value: 3 },
        { source: 0, target: 3, relation: '朋友', value: 6 },
        { source: 1, target: 2, relation: '朋友', value: 6 },
        { source: 1, target: 3, relation: '朋友', value: 7 },
        { source: 2, target: 3, relation: '朋友', value: 7 },
        { source: 0, target: 4, relation: '朋友', value: 3 },
        { source: 0, target: 5, relation: '朋友', value: 3 },
        { source: 4, target: 5, relation: '夫妻', value: 1 },
        { source: 0, target: 6, relation: '兄弟', value: 2 },
        { source: 4, target: 6, relation: '同学', value: 3 },
        { source: 5, target: 6, relation: '同学', value: 3 },
        { source: 4, target: 7, relation: '同学', value: 4 },
        { source: 5, target: 7, relation: '同学', value: 3 },
        { source: 6, target: 7, relation: '同学', value: 3 },
        { source: 4, target: 8, relation: '师生', value: 4 },
        { source: 5, target: 8, relation: '师生', value: 5 },
        { source: 6, target: 8, relation: '师生', value: 3 },
        { source: 7, target: 8, relation: '师生', value: 5 },
        { source: 8, target: 9, relation: '师生', value: 4 },
        { source: 3, target: 9, relation: '师生', value: 5 },
        { source: 2, target: 10, relation: '母子', value: 1 },
        { source: 10, target: 11, relation: '雇佣', value: 6 },
        { source: 10, target: 12, relation: '雇佣', value: 6 },
        { source: 11, target: 12, relation: '同事', value: 7 }
      ]
    }

    let simulation = d3
      .forceSimulation() // 构建力导向图
      .force(
        'link',
        d3
          .forceLink()
          .id(function(d, i) {
            return i
          })
          .distance(function(d) {
            return d.value * 50
          })
      )
      .force('charge', d3.forceManyBody())
      .force('center', d3.forceCenter(width / 2, height / 2))

    let z = d3.scaleOrdinal(d3.schemeCategory20) // 通用线条的颜色
    //画连接线
    var svg = d3.select('body')
    .append('svg')
    .attr("width",1000)
    .attr("height",1000)
    //连接线
    let link = svg
      .append('g') // 画连接线
      .attr('class', 'links')
      .selectAll('line')
      .data(data.edges)
      .enter()
      .append('line')
      //连接线上的文字
      let linkText = svg
      .append('g') // 画连接连上面的关系文字
      .attr('class', 'link-text')
      .selectAll('text')
      .data(data.edges)
      .enter()
      .append('text')
      .text(function(d) {
        return d.relation
      })
      //画圆圈和上面的文字
      let node = svg
      .append('g') // 画圆圈和文字
      .attr('class', 'nodes')
      .selectAll('g')
      .data(data.nodes)
      .enter()
      .append('g')
      .on('mouseover',function(d,i){
           //显示连接线上的文字
        linkText.style('fill-opacity', function(edge) {
          if (edge.source === d || edge.target === d) {
            return 1
          }
        })
        //连线加粗
        link
          .style('stroke-width', function(edge) {
            if (edge.source === d || edge.target === d) {
              return '2px'
            }
          })
          .style('stroke', function(edge) {
            if (edge.source === d || edge.target === d) {
              return '#000'
            }
          })

      })
      .on('mouseout', function(d, i) {
        //隐去连接线上的文字
        linkText.style('fill-opacity', function(edge) {
          if (edge.source === d || edge.target === d) {
            return 0
          }
        })
        //连接线减粗
        link
          .style('stroke-width', function(edge) {
            if (edge.source === d || edge.target === d) {
              return '1px'
            }
          })
          .style('stroke', function(edge) {
            if (edge.source === d || edge.target === d) {
              return '#ddd'
            }
          })
      })
      .call(
        d3
          .drag()
          .on('start', dragstarted)
          .on('drag', dragged)
          .on('end', dragended)
      )

    node
      .append('circle')
      .attr('r', 5)
      .attr('fill', function(d, i) {
        return z(i)
      })

    node
      .append('text')
      .attr('fill', function(d, i) {
        return z(i)
      })
      .attr('y', -20)
      .attr('dy', '.71em')
      .text(function(d) {
        return d.name
      })
      simulation // 初始化力导向图
      .nodes(data.nodes)
      .on('tick', ticked)

    simulation.force('link').links(data.edges)
    function ticked() {
      // 力导向图变化函数,让力学图不断更新
      link
        .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
        })
      linkText
        .attr('x', function(d) {
          return (d.source.x + d.target.x) / 2
        })
        .attr('y', function(d) {
          return (d.source.y + d.target.y) / 2
        })
      node.attr('transform', function(d) {
        return 'translate(' + d.x + ',' + d.y + ')'
      })
    }

    function dragstarted(d) {
      if (!d3.event.active) {
        simulation.alphaTarget(0.3).restart()
      }
      d.fx = d.x
      d.fy = d.y
    }

    function dragged(d) {
      d.fx = d3.event.x
      d.fy = d3.event.y
    }

    function dragended(d) {
      if (!d3.event.active) {
        simulation.alphaTarget(0)
      }
      d.fx = null
      d.fy = null
    }
        </script>
    </body>
    </html>
    ```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值