gpt4 book ai didi

javascript - 使用 d3.nest 实现 D3 树形图 json

转载 作者:行者123 更新时间:2023-12-03 00:57:43 26 4
gpt4 key购买 nike

<!DOCTYPE html>
<meta charset="utf-8">
<head>
<title>My treemap</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>

</head>
<style>

body {
font: 10px sans-serif;
position: relative;
}

.node {
box-sizing: border-box;
line-height: 1em;
overflow: hidden;
position: absolute;
white-space: pre;
background: #ddd;
}

.node-label,
.node-value {
margin: 4px;
}

.node-value {
margin-top: -2px;
}

.node-value {
font-weight: bold;
}
</style>
<body>
<svg width="1000" height="1000">
<g></g>
</svg>
<script>
const margin = {top: 40, right: 10, bottom: 10, left: 10};
var width = 960 - margin.left - margin.right;
var height = 960 - margin.top - margin.bottom;
var color = d3.scaleOrdinal().range(d3.schemeCategory20b);
var treemap = d3.treemap()
.size([width, height])
.padding(1)
.round(true);
var json_data=d3.json("https://raw.githubusercontent.com/vega/vega/master/docs/data/cars.json", function(error, data) {
if (error) throw error;
var nested_data = d3.nest()
.key(function(d) { return d.Origin; })
.key(function(d) { return d.Cylinders; })
.key(function(d) { return d.Miles_per_Gallon; })
.rollup(function(leaves){return {"value" : leaves.length}
})
.entries(data);
console.log(nested_data);
var root = d3.hierarchy(nested_data);
root.sum(function(d) {
return d.value;})

treemap(root);
var nodes = d3.select('svg g')
.selectAll('g')
.data(root.descendants())
.enter()
.append('g')
.attr('transform', function(d) {return 'translate(' + [d.x0, d.y0] + ')'})

nodes
.append('rect')
.attr('width', function(d) { return (d.x1 - d.x0)*10; })
.attr('height', function(d) { return (d.y1 - d.y0)*10; })
.attr('fill', function(d){ return color(d.data.key);
})

nodes
.append('text')
.text(function(d) {
return d.data.key;})



});

</script>
</body>

我正在尝试使用非分层数据结构(示例 cars.json 数据结构)创建树形图。现在我很困惑为什么我的代码在浏览器上没有显示任何内容。我在将嵌套键和值附加到树的根和节点时特别遇到麻烦。有人可以向我解释一下吗?另外,你能告诉我我的代码有什么问题吗?

最佳答案

您的代码即将完成;唯一缺少的是您需要向层次结构添加一个假根节点,为子节点指定访问器,并修复叶节点的值,叶节点有一个需要删除的额外嵌套层。

叶子节点值:

var nested_data = d3.nest()
[...]
.rollup(function(leaves) {
return {
value: leaves.length
}
})
.entries(data);

叶节点的结果如下:

{ value: { value: 5 } }

rollup调用中删除额外的值::

var nested_data = d3.nest()
[...]
.rollup(function(leaves) {
return leaves.length
})
.entries(data);

现在你的叶节点看起来像这样:

{ value: 5 }

假根节点

通过添加假根确保所有嵌套数据都收集在同一层次结构中:

d3.hierarchy({ values: nested_data })

子节点访问器

指定子节点的访问器,否则 d3 将查找 x.children,如果不存在,则假定该节点是叶子:

d3.hierarchy({ value: nested_data }, function(d) { return d.values })

结果:

const margin = {
top: 40,
right: 10,
bottom: 10,
left: 10
};
var width = 960 - margin.left - margin.right;
var height = 960 - margin.top - margin.bottom;
var color = d3.scaleOrdinal().range(d3.schemeCategory20b);
var treemap = d3.treemap()
.size([width, height])
.padding(1)
.round(true);
var json_data = d3.json("https://raw.githubusercontent.com/vega/vega/master/docs/data/cars.json", function(error, data) {
if (error) throw error;
var nested_data = d3.nest()
.key(function(d) {
return d.Origin;
})
.key(function(d) {
return d.Cylinders;
})
.key(function(d) {
return d.Miles_per_Gallon;
})
.rollup(function(leaves) {
return leaves.length
})
.entries(data);

var root = d3.hierarchy({
values: nested_data
}, d => d.values)
.sum(function(d) {
return d.value;
})

treemap(root);
var nodes = d3.select('svg g')
.selectAll('g')
.data(root.descendants())
.enter()
.append('g')
.attr('transform', function(d) {
return 'translate(' + [d.x0, d.y0] + ')'
})

nodes
.append('rect')
.attr('width', function(d) {
return (d.x1 - d.x0) * 10;
})
.attr('height', function(d) {
return (d.y1 - d.y0) * 10;
})
.attr('fill', function(d) {
return color(d.data.key);
})

nodes
.append('text')
.text(function(d) {
return d.data.key;
})
});
body {
font: 10px sans-serif;
position: relative;
}

.node {
box-sizing: border-box;
line-height: 1em;
overflow: hidden;
position: absolute;
white-space: pre;
background: #ddd;
}

.node-label,
.node-value {
margin: 4px;
}

.node-value {
margin-top: -2px;
}

.node-value {
font-weight: bold;
}
<title>My treemap</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>

<svg width="1000" height="1000">
<g></g>
</svg>

关于javascript - 使用 d3.nest 实现 D3 树形图 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52751672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com