Graph d3.js:将链接标签与链接本身对齐

Graph d3.js:将链接标签与链接本身对齐,graph,d3.js,hyperlink,label,force-layout,Graph,D3.js,Hyperlink,Label,Force Layout,社区好!这就是我想要实现的。。。 这是到目前为止我的工作代码(与图片的左半部分相关): 因此,我已经成功地将文本附加到链接上,但是现在我如何定位链接上方的链接方向,如我的附加图片所示 非常感谢您的帮助,我应该会有所帮助。因此,我必须添加一个path元素并将其附加到链接中,然后添加一个text元素并将其附加到路径中?您可以以类似的方式将文本沿着已有的行放置。因此,我将为我的链接提供一个id属性(“path1”)并创建var newtext=svg.append(“text”)……append(“t

社区好!这就是我想要实现的。。。 这是到目前为止我的工作代码(与图片的左半部分相关):

因此,我已经成功地将文本附加到链接上,但是现在我如何定位链接上方的链接方向,如我的附加图片所示


非常感谢您的帮助,我应该会有所帮助。因此,我必须添加一个path元素并将其附加到链接中,然后添加一个text元素并将其附加到路径中?您可以以类似的方式将文本沿着已有的行放置。因此,我将为我的链接提供一个id属性(“path1”)并创建var newtext=svg.append(“text”)……append(“textpath”).attr(“xlink:href”,“#path1”).text(“此处的一些文本”)将文本添加到链接(?)。然而,现在所有的新文本都卡在左上角。我该如何更新它们在tick()函数中的位置?啊,我明白你的意思了——是的,你需要定义与这些行对应的单独路径并使用它们。
    var diagramElement = this.getElement(); 
    var links = eval(this.getState().string);
    // string = e.g. "[{source: \"Germany\", target: \"Europe\", property: \"is type\", type: \"connection\"}]"
    var width = 800, height = 300;

    var svg = d3.select(diagramElement).append("svg")
    .attr("width", width)
    .attr("height", height);

    var force = d3.layout.force()
    .size([width, height])
    .linkDistance(100)
    .charge(-400)
    .on("tick", tick);

    var link;
    var circle;
    var text;
    var nodes = {};
    var linktext;

   svg.append("defs")
    .selectAll("marker").data(["connection", "new"]).enter()
    .append("marker")
    .attr("id", function(d) { return d; })
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", 15)
    .attr("refY", 0)
    .attr("markerWidth", 8)
    .attr("markerHeight", 8)
    .attr("orient", "auto")
    .append("svg:path")
    .attr("d", "M0,-5L10,0L0,5");

    this.onStateChange = function() {

        svg.selectAll("g").remove();
        nodes = {};
        links = [];

        links = eval(this.getState().string);
        links.forEach(function(link) {
            link.source = nodes[link.source] || (nodes[link.source] = {name : link.source});
            link.target = nodes[link.target] || (nodes[link.target] = {name : link.target});
        });

        force
            .nodes(d3.values(nodes))
            .links(links)
            .on("tick", tick)
            .start();

        link = svg.append("g").selectAll("line.link")
            .data(force.links())
            .enter()
            .append("svg:line")
            .attr("class", function(d) {return "link " + d.type;})
            .attr("marker-end", function(d) {return "url(#" + d.type + ")";});


        circle = svg.append("g").selectAll("circle")
            .data(force.nodes())
            .enter()
            .append("circle")
            .attr("r", 8)
            .call(force.drag);

        text = svg.append("g").selectAll("text")
            .data(force.nodes())
            .enter()
            .append("text")
            .style("font-size","15px")
            .attr("x", 10)
            .attr("y", ".42em")
            .text(function(d) {return d.name;});

            // this is where the linktext is aligned relatively to the links
            // must change something here 
        linktext = svg.append("g").selectAll("text")
            .data(force.links())
            .enter()
            .append("text")
            .style("font-size","15px")
            .attr("dx", 1)
            .attr("dy", ".35em")
            .attr("text-anchor", "middle")
            .text(function(d) {return d.type;});


    };

    function tick() {

        circle.attr("cx", function(d) { return d.x = Math.max(12, Math.min(798 - 12, d.x)); })
              .attr("cy", function(d) { return d.y = Math.max(12, Math.min(279 - 12, d.y)); });

        text.attr("transform", transform);

        // linktext position update     
        linktext.attr("transform", function(d) {return "translate(" + (d.source.x + d.target.x) / 2 + "," + (d.source.y + d.target.y) / 2 + ")";});   

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