Javascript 如何更新模块化可视化
我正在帮助指导一个结合了D3中一些可视化的项目。在我们的具体示例中,我们使用常规D3饼图和sankey布局可视化来生成一个饼图。其影响是产生如下结果: 开发的目的是尽可能地将其模块化,因此第一步是生成一个更新的饼图,该饼图可以单独使用或插入另一个可视化中。它当前被封装到一个Javascript 如何更新模块化可视化,javascript,d3.js,Javascript,D3.js,我正在帮助指导一个结合了D3中一些可视化的项目。在我们的具体示例中,我们使用常规D3饼图和sankey布局可视化来生成一个饼图。其影响是产生如下结果: 开发的目的是尽可能地将其模块化,因此第一步是生成一个更新的饼图,该饼图可以单独使用或插入另一个可视化中。它当前被封装到一个pieObject中,看起来像这样: var pieObject = function( d, target ){ var pie = {}; // other code to handle init
pieObject
中,看起来像这样:
var pieObject = function( d, target ){
var pie = {};
// other code to handle init
pie.update = function(data) {
// render code
};
};
当我需要开始处理更新时,在树可视化中会出现一些混乱。以下是如何添加新饼图:
sankey.nodes(data.nodes)
.links(data.links)
.layout(32);
var node = svg.append("g")
.selectAll(".node")
.data(data.nodes)
.enter()
.append("g")
.attr("class", "node")
.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });
.each( function( d ) {
var pie = new pieObject( d, this );
})
但是,如果我想处理现有节点,我不确定应该如何访问pieObject
?我可以想到几个选择,但我想知道是否有一种通用的方法
d
d
sankey.nodes(data.nodes).links(data.links).layout(32)
这会丢失我存储在d
对象上的任何附加信息吗
编辑
我已经整理了一个例子来帮助说明我的问题。代码有点长,我还没有拥有它,所以我不知道所有的细节,但这里有一个细分:
- 1-#214-生成树布局的Sankey代码
- 215-#451-饼图代码
- 453-#475-将viz添加到页面的代码
具体地说,创建派并尝试找出如何更新派的领域是线间渲染函数#129-#149我建议从Mike Bostock的可重用图表教程开始,它与您所寻找的内容非常接近:
具体来说,这类事情的关键是使用selection.call()函数以可重用的方式将图表插入到另一个图表/布局中。然后,当您需要更新嵌入式图表时,只需再次执行相同的选择。call()。希望这能让你开始。谢谢你的回答Ethan,我以前读过那篇文章,但刚刚重新阅读了
selection.call()
的文档,我仍然不太明白你的建议。你能详细说明一下吗,也许是一个代码示例?我认为你需要从使用.each(…新pieObject…)切换到使用.call(pieChart),其中pieChart是一个函数,采用了本文中的选择。在pieChart函数中,通过检查所选内容来确定是否已经实例化了图表。如果尚未实例化,请执行初始化工作,如果已实例化,请执行更新。如果您想组合一个最小的JSFIDLE或类似的示例,我很乐意尝试更新它。我想我有点明白,但我还有一个问题需要一个JSFIDLE(这有点相关),所以我也可以将其包括在内。可能需要一点时间,但我会更新和评论,让您知道。谢谢-我在我的原始帖子中添加了一个链接,并对代码的重要部分做了一些评论…这里是一个开始:它工作不正常,我没有尝试更新为使用call而不是每个,但可能会给你一些开始的想法。我建议回到过去,从零开始,用一个更基本的版本,慢慢地重新构建。有一个更基本的版本也有助于在这里得到答案。