【问题标题】:d3js force-directed graph draws nodes but no linksd3js力导向图绘制节点但没有链接
【发布时间】:2017-08-16 16:05:56
【问题描述】:

我有力导向图。它显示没有问题的节点,并在控制台上写入链接 - 源和目标。但不将其连接到节点。我可以看到协调员没有字段请参阅picture

整个代码都在 Kibana 中,而且更复杂,但这里是核心:

const link = svg.selectAll('link')
            .data(links)
            .enter()
            .append('svg:line')
            .attr('class', 'link')
            .style("stroke-width", function (d) {return Math.sqrt(d.value);})
            .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;});



            force.on("tick", tick);

      function tick() {
        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; });
        node.attr("transform", function(d) {
                            return "translate(" + d.x + "," + d.y + ")"; });
              };

        var node = svg.selectAll('node')
            .data(nodes)
            .enter()
            .append('circle')
            .attr('class', 'node')
            .style("opacity", .9)
            .attr("r", function(d) { return 10; })
            .attr("id", function(d) { return d.id; })
            .attr("cy", function(d){return d.y;})
            .attr("cx", function(d){return d.x;})
            .style("fill",  function(d) { return c20(d.value);})
            .style("stroke-width", 20);

 const svg = div.append('svg')
          .attr('width', width)
          .attr('height', height)
          .append('g')
          .attr('transform', 'translate('+ width / 2 + ',' + height / 3 + ')');


        var force = d3.layout.force()
        .nodes(nodes)
        .links(links)
        .charge(-150)
        .linkDistance(90)
        .start();

我的数据结构:

 links =   
  [{"source": 0, "target": 1, "value":  30},
  {"source": 0, "target": 2, "value":  5},
  {"source": 1, "target": 3, "value":  1},
  {"source": 2, "target": 0, "value":  20}]


 nodes =          
 [{"ip": "92.15.122.1", "value": 5, id:  0},
  {"ip": "12.154.154.22", "value": 20, id:  1},
  {"ip": "255.12.11.1", "value": 30, id:  2},
  {"ip": "54.55.6.55", "value": 1, id:  3}]

我认为问题是将“id”从“节点”连接到“源”和“目标”的链接。知道怎么做吗?

【问题讨论】:

    标签: d3.js directed-graph


    【解决方案1】:

    你需要在link变量上设置描边颜色

    var link = svg.selectAll('link')
      .data(links)
      .enter()
      .append('line')
      .attr('class', 'link')
      .style("stroke", 'black')
    

    请参阅下面的完整 sn-p。我已经清理了它,让它在 Stack sn-p 中运行。

    var width = 320,
      height = 240;
    
    links = [{
        "source": 0,
        "target": 1,
        "value": 30
      },
      {
        "source": 0,
        "target": 2,
        "value": 5
      },
      {
        "source": 1,
        "target": 3,
        "value": 1
      },
      {
        "source": 2,
        "target": 0,
        "value": 20
      }
    ]
    
    
    nodes = [{
        "ip": "92.15.122.1",
        "value": 5,
        id: 0
      },
      {
        "ip": "12.154.154.22",
        "value": 20,
        id: 1
      },
      {
        "ip": "255.12.11.1",
        "value": 30,
        id: 2
      },
      {
        "ip": "54.55.6.55",
        "value": 1,
        id: 3
      }
    ]
    
    var svg = d3.select('body').append('svg')
      .attr('width', width)
      .attr('height', height)
      .attr('transform', 'translate(' + width / 2 + ',' + height / 3 + ')');
    
    var force = d3.layout.force()
      .size([width, height])
      .nodes(nodes)
      .links(links);
    
    
    function tick() {
      node.attr('r', width / 25)
        .attr('cx', function(d) {
          return d.x;
        })
        .attr('cy', function(d) {
          return d.y;
        });
    
      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;
        });
    }
    
    force.on("tick", tick);
    
    var link = svg.selectAll('link')
      .data(links)
      .enter()
      .append('line')
      .attr('class', 'link')
      .style("stroke", 'black')
      .style("stroke-width", function(d) {
        return Math.sqrt(d.value);
      }).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;});
    
      
    
    
    var node = svg.selectAll('node')
      .data(nodes)
      .enter()
      .append('circle')
      .attr('class', 'node')
      .style("opacity", .9)
      .attr("r", function(d) {
        return 10;
      })
      .attr("id", function(d) {
        return d.id;
      })
      .attr("cy", function(d) {
        return d.y;
      })
      .attr("cx", function(d) {
        return d.x;
      })
      .style("stroke-width", 20);
    
    
    
    force
      .nodes(nodes)
      .links(links)
      .charge(-150)
      .linkDistance(90)
      .start();
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

    • 仍然无法正常工作,因此错误必须在其他地方。但是链接数据是正确的,它甚至创建了正确数量的线元素。嗯..
    • 我注意到您的线条元素没有任何坐标或翻译。你能用我的代码 sn-p 让它工作吗?
    • 我认为这是因为它不知道如何将节点映射到目标和源链接。但是如果图表的代码是正确的,而且数据也是正确的,我不知道哪里有问题。 ://
    • 我不确定您的代码是否 100% 正确,我必须对其进行调整才能使其在这里工作。
    • 我明白了。我有两个不同的函数来创建链接和节点(因为 kibana),并且由于某些原因没有调用链接的刻度函数。感谢您的帮助!
    猜你喜欢
    • 2019-05-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2015-12-04
    相关资源
    最近更新 更多