Javascript D3树映射调用产生NaN x0、x1、y0、y1值
我正在建立一个D3可视化系统,我遇到了一些麻烦 我已经能够填充我的初始树形图,但我想通过点击交互对其进行修改。为了做到这一点,我需要在每次单击时重新计算一个新的布局(然后在以后使用它做一些事情),使用我以前(当前显示的)数据的子集来完成 我已经编写了一个函数,它可以按我所希望的方式工作,并在我的Javascript D3树映射调用产生NaN x0、x1、y0、y1值,javascript,d3.js,Javascript,D3.js,我正在建立一个D3可视化系统,我遇到了一些麻烦 我已经能够填充我的初始树形图,但我想通过点击交互对其进行修改。为了做到这一点,我需要在每次单击时重新计算一个新的布局(然后在以后使用它做一些事情),使用我以前(当前显示的)数据的子集来完成 我已经编写了一个函数,它可以按我所希望的方式工作,并在我的新根对象中填充每个节点的值属性。据我所知,这是在我的new_root上运行d3.treemap的唯一先决条件以下是代码片段: let treemap = d3.treemap() .tile(d3
新根对象中填充每个节点的值
属性。据我所知,这是在我的new_root
上运行d3.treemap
的唯一先决条件以下是代码片段:
let treemap = d3.treemap()
.tile(d3.treemapResquarify)
.size([800, 400])
.round(true)
.paddingInner(1);
// later...
function object_is_direct_child(root, obj) {
return (root.children.filter(child => (child.id === obj.name)).length > 0);
}
// ...much later...
// Create and bind the click event.
let click = function(d) {
if (d.data.children.length > 0) {
// Use the hover ID to get the underlying name attr (e.g. "Noise-hover" -> "Noise")
let name = this.getAttribute("id").slice(0,-6);
// Select the new root node.
let new_root = root.children.find(c => c.id === name);
// Sum.
new_root = new_root.sum(node => ((object_is_direct_child(new_root, node)) ? node.n : 0));
// Here is the problem area. This doesn't work as expected.
treemap(new_root);
}
}
hover_rects.on("click", click);
这应该填充new_节点
及其所有子节点上计算的、liad outx0、x1、y0、y1
值。相反,new_节点及其所有子节点都是NaN
我已经上传了到目前为止的要点。我能够使用以下MWE脚本在节点中运行来调试它:
'use strict';
// Load data.
const tree = require('../threshold-tree');
const d3 = require('d3');
const assert = require('assert');
// Load in the data file as it would be loaded in the browser.
const fs = require('fs');
const csvString = fs.readFileSync('data/complaint_types.csv').toString();
const raw_data = d3.csvParse(csvString);
let tr = new tree.ThresholdTree(raw_data);
let hr = tr.as_hierarchy();
let root = d3.stratify().id(d => d.name).parentId(d => d.parent)(hr);
function object_is_direct_child(root, obj) {
return (root.children.filter(child => (child.id === obj.name)).length > 0);
}
// Now the sum function itself.
function nodal_summer(node) {
return ((object_is_direct_child(root, node)) ? node.n : 0);
}
root = root.sum(nodal_summer);
// Create our treemap layout factory function.
let treemap = d3.treemap()
.tile(d3.treemapResquarify)
.size([800, 400])
.round(true)
.paddingInner(1);
// Apply our treemap function to our data.
debugger;
treemap(root);
// Again...this is where it fails!
let new_root = root.children[0];
new_root.parent = null;
new_root = new_root.sum(node => ((object_is_direct_child(new_root, node)) ? node.n : 0));
debugger;
new_root = treemap(new_root);
console.log(treemap(new_root));
罪魁祸首是d3
中的positionNode
回调:
function positionNode(node) {
var p = paddingStack[node.depth],
...
paddingStack
被初始化为长度为1的列表,但是节点。depth
是1
,因此p
被初始化为NaN
,从那里传播
两个有效的修复方法是:
使用node.copy()
new_root.eachBefore(函数(节点){node.depth-->)