我正在尝试做一些明显的事情,让我的有向图形链接的箭头颜色与边缘颜色相匹配。令人惊讶的是,我还没有找到一个完整的解决方案,虽然this older post似乎是一个很好的起点。如果适应该解决方案的工作方式如下所述,或者如果有创建达到这种效果的箭头的更好方法,我会非常感激。将箭头颜色与D3中的线条颜色相匹配
首先,我有一个线性渐变色功能的属性这样上色我的边缘:
var gradientColor = d3.scale.linear().domain([0,1]).range(["#08519c","#bdd7e7"]);
然后,像以前的文章中,我有添加标记功能:
function marker (color) {
var reference;
svg.append("svg:defs").selectAll("marker")
.data([reference])
.enter().append("svg:marker")
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15) // This sets how far back it sits, kinda
.attr("refY", 0)
.attr("markerWidth", 9)
.attr("markerHeight", 9)
.attr("orient", "auto")
.attr("markerUnits", "userSpaceOnUse")
.append("svg:path")
.attr("d", "M0,-5L10,0L0,5")
.style("fill", color);
return "url(#" + reference + ")"; };
然后我的链接定义是基于Curved Links example的这一个。
var link = svg.selectAll(".link")
.data(bilinks)
.enter().append("path")
.attr("class", "link")
.style("fill", "none")
.style("opacity", "0.5")
.style("stroke-width", "2")
.style("stroke", function(d) { return gradientColor(d[3]); })
.attr("marker-end", marker("#FFCC33"));
这不会写作;浏览器给我一个“Uncaught TypeError:无法读取未定义的属性'5'(其中'd [5]'指的是链接所具有的属性列表中的第五个属性)。在这种情况下,问题显然是将数据函数传递给标记函数。如果我像“#FFCC33”那样输入静态颜色,那么箭头会改变颜色(现在)。不幸的是,1.5年前发布这种“标记函数”解决方案的人并没有将颜色传递给标记函数。
我不知道如何正确喂食链接的颜色。理想情况下,我将能够使用对箭头所连接的链接的颜色的引用,而不是输入相同的颜色函数(因为最终我将通过基于按钮按压的不同方案来着色链接)。
我创建了一个JS Fiddle,其中包含了查看和解决问题所需的所有位。目前,我将静态颜色传递给标记,但它应该是连接到它的链接的颜色。我还包含了关于正确定位箭头和边缘尾部的另一个问题的功能。
这让我奇怪,为什么老回答您链接到有任何upvotes可言。虽然这个想法可能是正确的,但是代码不会出于某些原因:1. val不会被分配任何值,所以返回值将是'“url(#undefined)”; 2.“id”将始终是一个空字符串; 3.当将函数'marker()'传递给'attr()'时,参数丢失。要获得有关此代码适配的帮助,建立一个可用的示例可以很有帮助。 – altocumulus