这与没有为此序数尺度指定域的事实有关。
确实,您不需要按照文档 (https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_domain) 中的描述为序数比例指定域。在这种情况下,它会在您使用秤时自动构建一个域。它在规模实例中跟踪该域。
问题是,在您的情况下,您为每次调用 getColorForNode 创建一个新的比例实例。因此,没有持久域。每次从头开始构建域时,它都会输出第一个范围值:#1f77b4。
所以,基本上有两种解决方案:
选项 1:将规模实例构造保留在函数之外
var p = d3.scale.category10();
function getColorForNode(d) {
var metricValue = metrics.getScore(d.id);
return p(metricValue);
}
选项 2:明确指定域
function getColorForNode(d) {
var p = d3.scale.category10().domain(d3.range(10));
var metricValue = metrics.getScore(d.id);
return p(metricValue);
}