适应d3序列sunburst示例以新的数据和获取js错误

问题描述:

我试图从d3画廊重新调整the sequences sunburst example,并得到没有viz + js错误,我不知道如何解决。适应d3序列sunburst示例以新的数据和获取js错误

“我的”代码可以找到here。我从原来的唯一改变(很多)是使用我自己的(现在是假的)数据来描述吸烟者&来看病人的情况。他们可以讨论戒烟和肺癌筛查,每种方法都有自己独特的管道。

错误来自sequences.js中的buildHierarchy()函数。这个家伙会使用提供的原始样本数据(样本数据很好)(在回购中提供的样本数据为'sample-data.csv' - 将sequence.js的第46行更改为切换到此样本)。但是,当我指出它在my little fake dataset,它barfs有:

Uncaught TypeError: Cannot read property 'push' of undefined sequences.js:303 

我已经通过该功能加强&可以看到,它发生后的功能去增加一个叶节点的第一行的最后一个组件在csv。在执行中的那一点,children未设置,因此对其调用push()失败。

我不明白为什么原始数据不会导致此问题,或者如何修复buildHierarchy()以便它能正常工作。

任何帮助感激地接受。

这应该解决它,对于某些数据集遇到类似的问题。刚创建新的子节点时添加了子节点:[]。此外,除非你添加一个“-End”的一个要素数据位(DiscussScreening和DiscussedCessation)之类的例子,说明有产品会显得稍有不妥>末

function buildHierarchy(csv) { 
    var root = { 
     "name": "root", 
     "children": [] 
    }; 
    for (var i = 0; i < csv.length; i++) { 
     var sequence = csv[i][0]; 
     var size = +csv[i][1]; 
     if (isNaN(size)) { // e.g. if this is a header row 
      continue; 
     } 
     var parts = sequence.split("-"); 
     var currentNode = root; 
     for (var j = 0; j < parts.length; j++) { 
      var children = currentNode["children"]; 
      var nodeName = parts[j]; 
      var childNode; 
      if (j + 1 < parts.length) { 
       // Not yet at the end of the sequence; move down the tree. 
       var foundChild = false; 
       for (var k = 0; k < children.length; k++) { 
        if (children[k]["name"] == nodeName) { 
         childNode = children[k]; 
         foundChild = true; 
         break; 
        } 
       } 
       // If we don't already have a child node for this branch, create it. 
       if (!foundChild) { 
        childNode = { 
         "name": nodeName, 
         "children": [] 
        }; 
        children.push(childNode); 
       } 
       currentNode = childNode; 
      } else { 
       // Reached the end of the sequence; create a leaf node. 
       childNode = { 
        "name": nodeName, 
        "size": size, 
        "children" : [] 
       }; 
       children.push(childNode); 
      } 
     } 
    } 
    return root; 
}; 
+0

可爱 - 谢谢!我没有注意到原始数据中的-end元素。有趣的是,如果我在每行添加一行,那么我根本不需要更改js。 –