6

我正在使用 D3 绘制有向无环图,并且我希望能够通过将边缘(和箭头)的颜色更改为该路径来突出显示选定节点的路径。我很容易改变边缘颜色,但我不知道如何改变相应箭头的颜色。我发现的最适用的来源表明这是不可能的,但这也是大约两年前的事情,所以我想看看情况是否发生了变化。我用来创建链接、箭头和更新链接颜色的代码如下:

graph.append("svg:defs").selectAll("marker")
     .data(["end"])
   .enter().append("svg:marker")    
     .attr("id", String)
     .attr("viewBox", "0 -5 10 10")
     .attr("refX", 20)
     .attr("refY", 0)
     .attr("markerWidth", 6)
     .attr("markerHeight", 6)
     .attr("orient", "auto")
     .style("fill", "gray")
   .append("svg:path")
     .attr("d", "M0,-5L10,0L0,5");

. . .

var link = graph.append("svg:g").selectAll("line")
     .data(json.links)
   .enter().append("svg:line")
     .style("stroke", "gray")
     .attr("class", "link")
     .attr("marker-end", "url(#end)");

. . .

function highlightPath(node) {
  d3.selectAll("line")
    .style("stroke", function(d) { 
      if (d.target.name == node) {
        highlightPath(d.source.name);
        return "lightcoral";
      } else {
        return "gray";
      }
    });
}

任何建议都会很棒。谢谢你。

4

2 回答 2

9

创建一个函数并为其提供返回值,并且val应该是动态的:

function marker (color) {
    var val;
    graph.append("svg:defs").selectAll("marker")
         .data([val])
         .enter().append("svg:marker")    
         .attr("id", String)
         .attr("viewBox", "0 -5 10 10")
         .attr("refX", 20)
         .attr("refY", 0)
         .attr("markerWidth", 6)
         .attr("markerHeight", 6)
         .attr("orient", "auto")
         .style("fill", color)
         .append("svg:path")
         .attr("d", "M0,-5L10,0L0,5");
    return "url(#" +val+ ")";
}

var link = graph.append("svg:g").selectAll("line")
                .data(json.links)
                .enter().append("svg:line")
                .style("stroke", "gray")
                .attr("class", "link")
                .attr("marker-end", marker); //"url(#end)"
于 2014-01-03T21:06:25.257 回答
2

不是最好的解决方案,但你可以像这样画箭头

var arrowHeads = svg.selectAll("polygon.arrowHeads") //arrow heads are triangles
    .data(links)
  .enter().append("polygon")
    .attr("id", function(d, i) {return "arrowHead0" + i})
    .attr("points", function(d, i) {
        //function here that outputs the three points of a triangle
    })
;

箭头和它的头部具有相同的索引(因为它们具有相同的附加数据)。

所以,你可以使用d3.select("#arrowHead0" + arrowIndex).attr("fill", "black");

于 2013-08-02T20:21:25.667 回答