【问题标题】:How to go about updating modular visualizations如何着手更新模块化可视化
【发布时间】:2015-01-12 15:49:30
【问题描述】:

我正在帮助指导一个在 D3 中结合一些可视化的项目。在我们的具体示例中,我们使用带有 sankey 布局可视化的常规 D3 饼图来生成饼图。这样做的影响是产生如下内容:

开发旨在尝试使其尽可能模块化,因此第一步是生成一个更新的饼图,可以单独使用或插入另一个可视化。这目前被封装成一个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?我能想到几个选项,但我想知道是否有常用的通用方法?

  1. 将 pieObject 存储在元素 d
  2. 将 pieObject 存储在数组或 JavaScript 对象中,并通过 d 上的字段进行查找

在我列出的示例中,我更喜欢选项 #1。但我也在从 JSON 重新加载我的整个数据集(例如,新的 JSON 请求返回现有数据 + 新数据)所以我相信当我调用 sankey.nodes(data.nodes).links(data.links).layout(32); 时,这将丢失我存储的任何其他信息d 对象?

编辑

我整理了一个JSFiddle 来帮助说明我的问题。代码有点长,我还没有拥有它,所以不知道所有的来龙去脉,但这里有一个细分:

  • 1-#214 - 生成树布局的 Sankey 代码

  • 215-#451 - 饼图代码

  • 453-#475 - 将可视化添加到页面的代码

特别是创建馅饼的区域,并试图弄清楚如何更新它们是在第 #129-#149 行之间的渲染函数中

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    我建议从 Mike Bostock 的关于可重复使用图表的教程开始,它几乎可以满足您的需求:http://bost.ocks.org/mike/chart/

    具体来说,这类事情的关键是使用 selection.call() 函数以可重用的方式将您的图表插入到另一个图表/布局中。然后,当您需要更新嵌入式图表时,只需再次执行相同的 selection.call() 即可。希望这能让你开始。

    【讨论】:

    • 感谢您的回答 Ethan,我以前读过那篇文章,但刚刚重新阅读了 + 文档 selection.call(),我仍然不太明白您的建议。你能详细说明一下吗,也许有一个代码示例?
    • 我认为您需要从使用 .each(... new pieObject ...) 切换到使用 .call(pieChart) ,其中 pieChart 是一个像文章中那样进行选择的函数。在您的 pieChart 函数中,通过检查选择的内容来确定您是否已经实例化了图表。如果您还没有实例化,请进行初始化工作,如果您已经实例化,请进行更新。如果您想组合一个最小的 JSFiddle 或类似示例,我很乐意尝试更新它。
    • 我想我有点追随,但我还有另一个问题需要一个 JSFiddle 来解决(这有点相关),所以我也不妨把它包括在内。可能需要我一点时间,但我会更新和评论让你知道。谢谢
    • Ethan - 我添加了一个指向我的原始帖子的链接以及一些关于重要代码位的位置的 cmet...
    • 这是一个开始:jsfiddle.net/zuwur218/1 它不能正常工作,我没有尝试更新以使用 call 而不是每个,但可能会给你一些开始的想法。我建议您返回并从头开始,使用您正在尝试做的更基本的版本并慢慢建立备份。拥有更基本的版本也有助于在这里获得答案。
    猜你喜欢
    • 2014-06-26
    • 2021-07-11
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多