您可以尝试使用具有固定、手动设置的输入域和输出范围的d3.scale.linear(),将您的任意数据映射到一致的、可预测的值。
例子:
function getSize(d){ return d.size; }
var params = [
this.aggregatedDataFromAllCharts_beforePacking,
getSize
], dataScale = d3.scale.linear()
.domain([d3.min.apply(window, params), d3.max.apply(window, params)])
.range([0, 1000]);
为了调整包的大小(根圆),您可能必须使用第二个比例,它将每个数据集的聚合值映射到根圆的具体 svg 圆半径。类似于以下内容:
var aggregatedSizes = [];
// for all datasets
aggregatedSizes.push(d3.sum(dataset, getSize));
var packSizeScale = d3.scale.linear()
.domain(Math.min(aggregatedSizes), Math.max(aggregatedSizes))
.range(this.minCircleRadius, this.maxCircleRadius );
...其中 min- 和 maxCircleRadius 是您要显示的最小和最大圆尺寸。
// for each of your data sets
var packedCircles = d3.layout.pack().nodes(dataset).value(function(d) {
return dataScale(d.size);
}).size([packSizeScale(d3.sum(dataset, getSize) *2)]);
还有一个很好的关于 D3 音阶的教程,作者 Scott Murray