D3 Dependency Wheel 无法正确呈现
D3 Dependency Wheel not rendering properly
我正在尝试为我的包构建一个像这样的依赖轮 http://www.redotheweb.com/DependencyWheel/。我写了下面的代码。但是,我的轮子没有正确渲染。
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://www.redotheweb.com/DependencyWheel/js/d3.dependencyWheel.js"></script>
<script>
<!-- My JSON is in following style -->
json = JSON.parse('{"A":["B","C","D","E"],"B":["F"]}
var packageNames = [];
var obj = {}
var matrix = [];
for (var key in json) {
if (json.hasOwnProperty(key) && !(key in obj)) {
packageNames.push(key);
obj[key] = true;
}
json[key].forEach(function (neighbor) {
if (!(neighbor in obj)) {
packageNames.push(neighbor);
obj[neighbor] = true;
}
});
}
for (var package of packageNames) {
matrix[packageNames.indexOf(package)] = [];
if (json[package] != null) {
json[package].forEach(function (neighbor) {
matrix[packageNames.indexOf(package)][packageNames.indexOf(neighbor)] = 1;
});
}
}
console.log(matrix);
console.log(packageNames);
jQuery(function () {
var chart = d3.chart.dependencyWheel();
d3.select('#chart_placeholder')
.datum({
packageNames: packageNames,
matrix: matrix
})
.call(chart);
});
</script>
<div id="chart_placeholder"></div>
我看到了什么?
此外,我的控制台出现以下错误:
Error: Invalid value for <path> attribute d="MNaN,NaNA200,200 0 0,1 NaN,NaNQ 0,0 NaN,NaNA200,200 0 0,1 NaN,NaNQ 0,0 NaN,NaNZ"
Error: Invalid value for <path> attribute transform="rotate(NaN)"
有人可以帮我解决这个问题吗?
问题在于您创建 matrix
数组的方式。您将 1
放在正确的位置,但 matrix
需要是一个方阵 (docs here),因此其余值应该是 0
。您的 matrix
看起来像这样:
作为修复,我创建了一个 0 填充的 matrix_row
,长度为 packageNames
,可以在循环遍历每个 package
:
// Define a new array, padded with zeros
var matrix_row = Array.apply(null, new Array(packageNames.length)).map(Number.prototype.valueOf,0);
for (var package of packageNames) {
// Then add this 0-filled row for each package to create a square matrix
matrix[packageNames.indexOf(package)] = matrix_row;
if (json[package] != null) {
// And now replace some of those 0s with 1s
json[package].forEach(function (neighbor) {
matrix[packageNames.indexOf(package)][packageNames.indexOf(neighbor)] = 1;
});
}
}
这是一个有效的插件:http://plnkr.co/edit/FeGSNFx5xd4MRKg1qG6U?p=preview
我正在尝试为我的包构建一个像这样的依赖轮 http://www.redotheweb.com/DependencyWheel/。我写了下面的代码。但是,我的轮子没有正确渲染。
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://www.redotheweb.com/DependencyWheel/js/d3.dependencyWheel.js"></script>
<script>
<!-- My JSON is in following style -->
json = JSON.parse('{"A":["B","C","D","E"],"B":["F"]}
var packageNames = [];
var obj = {}
var matrix = [];
for (var key in json) {
if (json.hasOwnProperty(key) && !(key in obj)) {
packageNames.push(key);
obj[key] = true;
}
json[key].forEach(function (neighbor) {
if (!(neighbor in obj)) {
packageNames.push(neighbor);
obj[neighbor] = true;
}
});
}
for (var package of packageNames) {
matrix[packageNames.indexOf(package)] = [];
if (json[package] != null) {
json[package].forEach(function (neighbor) {
matrix[packageNames.indexOf(package)][packageNames.indexOf(neighbor)] = 1;
});
}
}
console.log(matrix);
console.log(packageNames);
jQuery(function () {
var chart = d3.chart.dependencyWheel();
d3.select('#chart_placeholder')
.datum({
packageNames: packageNames,
matrix: matrix
})
.call(chart);
});
</script>
<div id="chart_placeholder"></div>
我看到了什么?
此外,我的控制台出现以下错误:
Error: Invalid value for <path> attribute d="MNaN,NaNA200,200 0 0,1 NaN,NaNQ 0,0 NaN,NaNA200,200 0 0,1 NaN,NaNQ 0,0 NaN,NaNZ"
Error: Invalid value for <path> attribute transform="rotate(NaN)"
有人可以帮我解决这个问题吗?
问题在于您创建 matrix
数组的方式。您将 1
放在正确的位置,但 matrix
需要是一个方阵 (docs here),因此其余值应该是 0
。您的 matrix
看起来像这样:
作为修复,我创建了一个 0 填充的 matrix_row
,长度为 packageNames
,可以在循环遍历每个 package
:
// Define a new array, padded with zeros
var matrix_row = Array.apply(null, new Array(packageNames.length)).map(Number.prototype.valueOf,0);
for (var package of packageNames) {
// Then add this 0-filled row for each package to create a square matrix
matrix[packageNames.indexOf(package)] = matrix_row;
if (json[package] != null) {
// And now replace some of those 0s with 1s
json[package].forEach(function (neighbor) {
matrix[packageNames.indexOf(package)][packageNames.indexOf(neighbor)] = 1;
});
}
}
这是一个有效的插件:http://plnkr.co/edit/FeGSNFx5xd4MRKg1qG6U?p=preview