这个填充函数定义在哪里?

时间:2012-04-07 02:36:28

标签: javascript svg d3.js geometry bubble-chart

在示例中,http://mbostock.github.com/d3/ex/bubble.html

Enter image description here

第27行:

.style("fill", function(d) { return fill(d.packageName); });

fill()在哪里定义?我也没有在d3.js中找到它。即使包名称不是颜色,也会分配一些随机颜色。怎么样?

3 个答案:

答案 0 :(得分:4)

查看您链接的代码段的最顶部:

var r = 960,
    format = d3.format(",d"),
    fill = d3.scale.category20c();

第三行是定义fill的地方。您可以在此处找到category20c的文档:

https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-category20

答案 1 :(得分:2)

源代码位于d3.v2.js上的第2997行:

d3.scale.category20c = function() {
  return d3.scale.ordinal().range(d3_category20c);
};

致电:

// lines 2894-2896
d3.scale.ordinal = function() {
  return d3_scale_ordinal([], {t: "range", x: []});
};

然后调用

// lines 2903-2905
function scale(x) {
    return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length];
}

传入的参数x设置为d3_category20c,从下面列出的20种可用颜色列表中分配颜色:

["#3182bd", "#6baed6", "#9ecae1", 
"#c6dbef", "#e6550d", "#fd8d3c", 
"#fdae6b", "#fdd0a2", "#31a354", 
"#74c476", "#a1d99b", "#c7e9c0", 
"#756bb1", "#9e9ac8", "#bcbddc", 
"#dadaeb", "#636363", "#969696", 
"#bdbdbd", "#d9d9d9"]

单步执行代码,我会看到这样分配的颜色(基于传入的类别):

cluster = 0 #3182bd
graph = 1 #6baed6
optimization = 2 #9ecae1
animate = 3  #c6dbef
interpolate = 4 #e6550d
converters = 5 #fd8d3c
data = 6 #fdae6b
display = 7 #fdd0a2
flex = 8 #31a354
physics = 9  #74c476
query = 10 #a1d99b
methods = 11 #c7e9c0
scale = 12 #756bb1
util = 13 #9e9ac8
heap = 14 #bcbddc
math = 15 #dadaeb
palette = 16 #636363
axis = 17 #969696
controls = 18 #bdbdbd
render = 19 #d9d9d9
events = 0 #3182bd
legend = 1 #6baed6
etc...

注意,它使用的是mod运算符,因此如果传入的类别数超过20种颜色的范围,它可以继续分配颜色。

注意,d3_category20c的颜色在category.js第48-54行中定义。

答案 2 :(得分:0)

如前所述,此代码:

var r = 960,
    format = d3.format(",d"),
    fill = d3.scale.category20c();

定义fill()。我只想添加以下方便的文档和参考卡组合:

enter image description here