2013-06-26 44 views
3

我使用D3的序数比例来将数字映射为颜色。 我已经使用这个:d3序数比例映射

color = d3.scale.ordinal().range(["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2"]).domain([0,6]); 
console.log(color(0),color(1),color(2),color(3),color(4),color(5),color(6)); 

我得到的回应是:

#1f77b4 #2ca02C#d62728 #9467bd #8c564b #e377c2 #ff7f0e

我很好奇,不应该回应是:

#1f77b4, #ff7f0e, #2ca02c, #d62728, #9467bd, #8c564b, #e377c2

请指教。

回答

17

域是不完全正确:

> color.domain() 
[0, 6, 1, 0.5] 

对于在ordinal scale's范围内的每个值,应该是在结构域的匹配值。

而不是设置域[0,6]的,它应该是[0, 1, 2, 3, 4, 5, 6]

color = d3.scale.ordinal() 
      .range(["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2"]) 
      .domain(d3.range(0,7)); 

检查,以确保一切更新颜色之后的工作原理:

> d3.range(0,7).forEach(function(d){ console.log(color(d)); }) 
#1f77b4 
#ff7f0e 
#2ca02c 
#d62728 
#9467bd 
#8c564b 
#e377c2 
+1

非常感谢! 这确实帮助了很多。对不起,我没有权限/点给你一个投票!但是一旦我得到它,我一定会给你一个投票。 再次感谢! – neoeahit

2

,因为只有2明确这是预期在您的域中定义值。因此,第一个值0分配给#1f77b4的第一个颜色,第二个值6分配给第二个颜色#ff7f0e,剩余部分在作为字符串在内部排序后被推断出来。您需要明确定义域以进行可预测的行为。例如,

color = d3.scale.ordinal() 
    .range(["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2"]) 
    .domain([0,1,2,3,4,5,6]); 

console.log(color(0),color(1),color(2),color(3),color(4),color(5),color(6)); 

作为documentation状态

上顺序量表设置域是可选的。如果未设置域,则传递给缩放函数的每个唯一值将从输出范围分配一个新值;换句话说,将从使用中隐含地推断该域。 但是,分配序号范围的域以确保确定性行为是一个好主意,因为根据使用情况推断域将取决于排序。