【问题标题】:How to add link name on the line d3.js?如何在 d3.js 行上添加链接名称?
【发布时间】:2023-04-02 19:19:01
【问题描述】:

我可以显示节点并通过链接动态连接节点。在这里,我显示的是图像而不是节点(圆圈)。但我试图在行首显示链接名称。我浏览了一些链接,但无法显示名称。

我可以在浏览器检查元素中看到文本元素。但是文字是不可见的。这是我的代码。

var nodes = [{"x":100,"y":240,"image":"/fpui/img/lan.png"},{"x":230,"y":240,"image":"/fpui/img/mpvpn_boxsmall.png"},{"x":360,"y":120,"image":"/fpui/img/router.png"},{"x":360,"y":240,"image":"/fpui/img/router.png"},{"x":360,"y":360,"image":"/fpui/img/router.png"},{"x":490,"y":120,"image":"/fpui/img/isp.png"},{"x":490,"y":240,"image":"/fpui/img/isp.png"},{"x":490,"y":360,"image":"/fpui/img/isp.png"},{"x":620,"y":240,"image":"/fpui/img/internet.png"},{"x":750,"y":120,"image":"/fpui/img/server.png"},{"x":750,"y":240,"image":"/fpui/img/server.png"},{"x":750,"y":360,"image":"/fpui/img/server.png"}] jquery-2.0.2.min.js line 4 > eval:405:1
var links = [{"source":0,"target":1,"class":"link-green","name":"LAN"},{"source":1,"target":2,"class":"link-green","name":"WAN1"},{"source":1,"target":3,"class":"link-green","name":"WAN2"},{"source":1,"target":4,"class":"link-green","name":"WAN3"},{"source":2,"target":5,"name":"","class":"link-green"},{"source":3,"target":6,"name":"","class":"link-green"},{"source":4,"target":7,"name":"","class":"link-green"},{"source":5,"target":8,"class":"link-green","name":""},{"source":6,"target":8,"class":"link-green","name":""},{"source":7,"target":8,"class":"link-green","name":""},{"source":8,"target":9,"class":"link-green","name":""},{"source":8,"target":10,"class":"link-green","name":""},{"source":8,"target":11,"class":"link-green","name":""}]

var svg = d3.select('#routeTestDisplay').append('svg')
        .attr('width', width)
        .attr('height', height);

    var force = d3.layout.force()
        .size([width, height])
        .nodes(nodes)
        .links(linkArr)
        .start();
    force.linkDistance(200);
    var link = svg.selectAll('.link')
        .data(linkArr)
        .enter().append('line')
        /*.attr('class', 'link')
         .style("stroke", function(d,i){
         return color(i)
         })*/
        .style("stroke-width", 3);

        link.append("text")
        .attr("class", "link-label")
        .attr("font-family", "Arial, Helvetica, sans-serif")
        .attr("fill", "Black")
        .style("font", "normal 12px Arial")
        .style("color", "black")
        .attr("dy", ".35em")
        .attr("text-anchor", "middle")
        .text(function(d) {
            return d.name;
        })
            .attr("x", function(d) {
                return ((d.source.x + d.target.x)/2);
            })
            .attr("y", function(d) {
                return ((d.source.y + d.target.y)/2);
            });



    var node = svg.selectAll('.node')
        .data(nodes)
        .enter().append('svg:image')
        .attr("width", 50)
        .attr("height", 50)

    node.attr('r', 30)
        .attr("xlink:href", function(d) {
            return d.image;
        })
        .attr('x', function(d) {
            return d.x - 15;
        })
        .attr('y', function(d) {
            return d.y - 30;
        });
    link.attr('class', function(d) {
        return d.class;
    });
    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;
        });

您能否请任何人帮助如何实现这一目标?

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    您不能将文本附加到一行,您必须像这样将行和文本附加到同一个父级:

    var link = svg.selectAll('.link')
        .data(links)
        .enter().append('g') 
        .attr('class', 'link');
    
    var singlelink= link.append('line') //set this as a variable to translate later
       .style('stroke', 'black')
      .style("stroke-width", 3);
    
    link.append("text")
      .attr("class", "link-label") ...
    

    正如代码的 cmets 中所述,我必须在翻译链接时将您附加到链接变量的行设置为其自己的变量。但链接现在是一个容器,而不是线路本身。所以你稍后的翻译功能现在看起来像:

    singlelink.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 nodes = [{
      "x": 100,
      "y": 240,
      "image": "/fpui/img/lan.png"
    }, {
      "x": 230,
      "y": 240,
      "image": "/fpui/img/mpvpn_boxsmall.png"
    }, {
      "x": 360,
      "y": 120,
      "image": "/fpui/img/router.png"
    }, {
      "x": 360,
      "y": 240,
      "image": "/fpui/img/router.png"
    }, {
      "x": 360,
      "y": 360,
      "image": "/fpui/img/router.png"
    }, {
      "x": 490,
      "y": 120,
      "image": "/fpui/img/isp.png"
    }, {
      "x": 490,
      "y": 240,
      "image": "/fpui/img/isp.png"
    }, {
      "x": 490,
      "y": 360,
      "image": "/fpui/img/isp.png"
    }, {
      "x": 620,
      "y": 240,
      "image": "/fpui/img/internet.png"
    }, {
      "x": 750,
      "y": 120,
      "image": "/fpui/img/server.png"
    }, {
      "x": 750,
      "y": 240,
      "image": "/fpui/img/server.png"
    }, {
      "x": 750,
      "y": 360,
      "image": "/fpui/img/server.png"
    }] 
    //jquery - 2.0.2. min.js line 4 > eval: 405: 1
    var links = [{
      "source": 0,
      "target": 1,
      "class": "link-green",
      "name": "LAN"
    }, {
      "source": 1,
      "target": 2,
      "class": "link-green",
      "name": "WAN1"
    }, {
      "source": 1,
      "target": 3,
      "class": "link-green",
      "name": "WAN2"
    }, {
      "source": 1,
      "target": 4,
      "class": "link-green",
      "name": "WAN3"
    }, {
      "source": 2,
      "target": 5,
      "name": "",
      "class": "link-green"
    }, {
      "source": 3,
      "target": 6,
      "name": "",
      "class": "link-green"
    }, {
      "source": 4,
      "target": 7,
      "name": "",
      "class": "link-green"
    }, {
      "source": 5,
      "target": 8,
      "class": "link-green",
      "name": ""
    }, {
      "source": 6,
      "target": 8,
      "class": "link-green",
      "name": ""
    }, {
      "source": 7,
      "target": 8,
      "class": "link-green",
      "name": ""
    }, {
      "source": 8,
      "target": 9,
      "class": "link-green",
      "name": ""
    }, {
      "source": 8,
      "target": 10,
      "class": "link-green",
      "name": ""
    }, {
      "source": 8,
      "target": 11,
      "class": "link-green",
      "name": ""
    }]
    console.log(links)
    var width = 1500,height=1500;
    var svg = d3.select('#routeTestDisplay').append('svg')
      .attr('width', width)
      .attr('height', height);
    
    var force = d3.layout.force()
      .size([width, height])
      .nodes(nodes)
      .links(links)
      .start();
    force.linkDistance(200);
    
    var link = svg.selectAll('.link')
        .data(links)
        .enter().append('g') 
        .attr('class', 'link');
    var singlelink= link.append('line')
       .style('stroke', 'black')
      .style("stroke-width", 3);
    
    link.append("text")
      .attr("class", "link-label")
      .attr("font-family", "Arial, Helvetica, sans-serif")
      .attr("fill", "Black")
      .style("font", "normal 12px Arial")
      .style("color", "black")
      .attr("dy", ".35em")
      .attr("text-anchor", "middle")
      .text(function(d) {
        return d.name;
      })
      .attr("x", function(d) {
        return ((d.source.x + d.target.x) / 2);
      })
      .attr("y", function(d) {
        return ((d.source.y + d.target.y) / 2);
      });
    
    
    
    var node = svg.selectAll('.node')
      .data(nodes)
      .enter().append('svg:image')
      .attr("width", 50)
      .attr("height", 50)
    
    node.attr('r', 30)
      .attr("xlink:href", function(d) {
        return "https://www.petfinder.com/wp-content/uploads/2012/11/140272627-grooming-needs-senior-cat-632x475.jpg"
      })
      .attr('x', function(d) {
        return d.x - 15;
      })
      .attr('y', function(d) {
        return d.y - 30;
      });
      
    link.attr('class', function(d) {
      return d.class;
    });
    
    singlelink.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;
      });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    <div id='routeTestDisplay'></div>

    附言

    顺便说一句,我必须编辑您正在使用的链接数组的名称以及图像,因为它们的链接显然不起作用

    【讨论】:

      【解决方案2】:

      您不能将text 元素嵌套在line 中,它们必须是独立的DOM 元素。为了使它们具有相同的数据,您可以将它们一起放在g 块中:

       var link = svg.selectAll('.link')
          .data(linkArr)
          .enter().append('g') //link now represents the selection of  g elements  
          .attr('class', 'link') //class can be tricky: here I put the class on the g object, you might want to have a separate one for the line object.
      
      link.append('line') 
          /*.attr('class', 'link')
           .style("stroke", function(d,i){
           return color(i)
           })*/
          .style("stroke-width", 3);
      
      link.append("text")
          (...)
      

      【讨论】:

        猜你喜欢
        • 2016-08-26
        • 2014-08-13
        • 2017-06-17
        • 2017-05-31
        • 2013-09-27
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多