これは、この順序尺度にドメインが指定されていないという事実に関連しています。
ドキュメント(https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_domain)で説明されているように、順序スケールのドメインを指定する必要がないのは事実です。その場合、スケールを使用している間、その場でドメインが自動的に構築されます。スケールインスタンスでそのドメインを追跡します。
問題は、あなたの場合、getColorForNodeの呼び出しごとに新しいスケールインスタンスを作成することです。したがって、永続的なドメインはありません。ドメインの構築を最初から開始するたびに、最初の範囲値#1f77b4が出力されます。
したがって、基本的に2つの解決策があります。
オプション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);
}