2013-10-07 40 views
0

我知道d3.scale.ordinal功能要求,即d3.js使用通配符的顏色序號級別?

var color = d3.scale.ordinal() 
    .domain(["apple", "durian", "lemon"]) 
    .range(["red","green","yellow"]); 

確切x到x映射我的問題是我需要的水果,我還不知道(提供其顏色以分貝爲我會讀,但它經常變化)例如 「chiku」,「荔枝」等(事先不知道的水果等)。

我想將這些未在var顏色中定義的水果分配爲「棕色」。

問題: 1.可以完成以上任務嗎? 2.可以在域中使用regexp嗎?例如檸檬*(用於捕獲檸檬X,檸檬Y等)。

由於

回答

0

一種可能的解決方案是創建一個Object映射水果的顏色,例如

var fruit2color = {apple: "red", durian: "green", lemon: "yellow"} 

然後,在給出的fruits列表,您可以創建的使用map的色彩範圍。 map遍歷數組中的每個水果,並返回一個包含每個水果顏色的數組。顏色或者是您在fruit2color中放置的顏色,或者如果水果沒有指定的顏色,則只是'brown'

var fruits = ["lychee", "chiku", "durian", "plantain", "guava", "apple"]; 
var colors = fruits.map(function(f){ 
     return f in fruit2color ? fruit2color[f] : "brown" 
    }); 
var color = d3.scale.ordinal() 
    .domain(["apple", "durian", "lemon"]) 
    .range(colors); 

此代碼會給你的

colors = [ 'brown', 'brown', 'green', 'brown', 'brown', 'red' ] 

關於你問題的第二部分的色彩範圍,你可以爲了用正則表達式使用功能fruit2color(而不是對象)分配顏色,例如

var patt = /lemon./; 
function fruit2color(f){ 
    if (patt.test(f)) return "yellow"; 
    else if (f == "apple") return "red"; 
    else if (f == "durian") return "green"; 
    else return "brown"; 
} 
var colors = fruits.map(fruit2color); 

,然後通過將所得的顏色arrayrange()

+0

聽起來很不錯,可以動態創建'range()'和'domain()'數組。我會支持的。 – xmashallax