发布问题&在这里回答以后为别人解决同样的麻烦...
当我使用d3.layout.partition创建两个旭日形图时,第一个旭日形切片的比例会在调整切片大小时被第二个旭日形切片的比例覆盖。
这两个图表将不同的.value
访问者函数传递给分区布局,例如
d3.layout.partition()
.sort(null)
.value(function(d) { return 1; });
VS
d3.layout.partition()
.sort(null)
.value(function(d) { return d.size; });
他们会生成自己的节点列表,这些节点不会在两个sunbursts之间共享。但是,如果我重新调用d3.svg.arc
生成器调整为更大的半径(但不改变整体比例),则切片角度会突然被覆盖。
答案 0 :(得分:3)
问题是虽然partition.nodes()
似乎来生成新的数据结构(例如,如果你给它一些.key
函数,它会写出额外的属性(例如{{ 1}},.x
,.y
,.dx
)基础数据和不会复制数据。因此,如果数据结构是共享的在两个图表之间,这些dy
,.x
,.y
,.dx
属性会渗透到其他图表中。
这对我来说似乎是一个错误,但在阅读this old GitHub issue时,它似乎被视为“按设计”。也许它会在未来的版本中重新考虑。
一种解决方法是使用Lodash / Underscore dy
或Angular cloneDeep
之类的东西来使每个图表拥有自己的数据副本。
copy
答案 1 :(得分:2)
复制每个图表的整个数据集的另一种方法是在重新渲染之前简单地重新计算分区。
不要让makeSunburst()
成为访问者的功能,而是使其成为分区的功能。将不同的分区函数传递给每个图表:
// create separate partition variables
var countPartition = d3.layout.partition().sort(null).value(countAccessorFn);
var sizePartition = d3.layout.partition().sort(null).value(sizeAccessorFn);
// make the charts as a function of partition
charts.push(makeSunburst(root, countPartition));
charts.push(makeSunburst(root, sizePartition));
然后在应用转换之前,只需更新nodes
变量以反映相关的分区:
addToRadius: function(radiusChange) {
radius += radiusChange;
ringRadiusScale.range([0, radius]);
// update the data before re-rendering each chart
nodes = partition.nodes(dataRoot);
path.transition().attr('d', arc);
}
现在,当您更新每个图表时,它正在使用正确的分区。
这是一个updated example。