我正在嘗試做一些明顯的事情,讓我的有向圖形鏈接的箭頭顏色與邊緣顏色相匹配。令人驚訝的是,我還沒有找到一個完整的解決方案,雖然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