gpt4 book ai didi

javascript - 如何在 d3.js 中生成小倍数

转载 作者:行者123 更新时间:2023-11-30 14:39:54 25 4
gpt4 key购买 nike

我在 d3 中制作小倍数时遇到一些问题,即使在阅读了几个教程(例如 this)之后也是如此.我打算制作一组 2x2 条形图,但我的代码有问题,没有显示任何内容。

<!DOCTYPE html>

<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<style type="text/css">

</style>
</head>

<body>
<script type="text/javascript">
//Width and height
var w = 600;
var h = 250;
var margin = {
top: 45,
right: 100,
bottom: 20,
left: 20
};

var dataset = [{
"type": "A",
"idx": 1,
"value": 2
},
{
"type": "B",
"idx": 1,
"value": 2
},
{
"type": "C",
"idx": 1,
"value": 3
},
{
"type": "D",
"idx": 1,
"value": 3
},
{
"type": "A",
"idx": 2,
"value": 3
},
{
"type": "B",
"idx": 2,
"value": 2
},
{
"type": "C",
"idx": 2,
"value": 5
},
{
"type": "D",
"idx": 2,
"value": 1
}
];
var data = d3.nest()
.key(function(d) {
return d.type;
})
.entries(dataset);

var xScale = d3.scaleBand()
.domain(d3.range(data.length))
.rangeRound([0, w])
.paddingInner(0.05);

var yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.value)])
.range([0, h]);

//Create SVG element
var svg = d3.select("#vis").selectAll("svg")
.data(data)
.enter()
.append("svg:svg")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");


svg.selectAll(".bar")
.data(function(d) {
return d.values;
})
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function(d) {
return xScale(d.idx);
})
.attr("width", 10)
.attr("y", function(d) {
return yScale(d.value);
})
.attr("height", function(d) {
return yScale(d.value);
})
</script>
</body>

我打算为每个组制作一个条形图并将其布置在 2x2 网格上。但是在嵌套和附加多个 svg 之后,什么也没有出现。

感谢您指出这里出了什么问题。

最佳答案

问题如下:

您没有 ID 为 vis 的容器。创建它:

<div id="vis"></div>

条形的高度不正确。应该是:

.attr("height", function(d) {
return h - yScale(d.value);
})

但是,主要问题是y 尺度的范围。由于您有嵌套数组,它应该是:

.domain([0, d3.max(data, d => d3.max(d.values, e => e.value))])

请记住,您的代码将为所有 小倍数创建相同的比例。有时设计师希望每个小倍数都有不同的比例......

下面是修改后的代码:

<!DOCTYPE html>

<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<style type="text/css">

</style>
</head>

<body>
<div id="vis"></div>
<script type="text/javascript">
//Width and height
var w = 300;
var h = 150;
var margin = {
top: 5,
right: 10,
bottom: 5,
left: 10
};

var dataset = [{
"type": "A",
"idx": 1,
"value": 2
},
{
"type": "B",
"idx": 1,
"value": 2
},
{
"type": "C",
"idx": 1,
"value": 3
},
{
"type": "D",
"idx": 1,
"value": 3
},
{
"type": "A",
"idx": 2,
"value": 3
},
{
"type": "B",
"idx": 2,
"value": 2
},
{
"type": "C",
"idx": 2,
"value": 5
},
{
"type": "D",
"idx": 2,
"value": 1
}
];
var data = d3.nest()
.key(function(d) {
return d.type;
})
.entries(dataset);

var xScale = d3.scaleBand()
.domain(d3.range(data.length))
.rangeRound([0, w])
.paddingInner(0.05);

var yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d3.max(d.values, e => e.value))])
.range([0, h]);

//Create SVG element
var svg = d3.select("#vis").selectAll("svg")
.data(data)
.enter()
.append("svg:svg")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.selectAll(".bar")
.data(function(d) {
return d.values;
})
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function(d) {
return xScale(d.idx);
})
.attr("width", 10)
.attr("y", function(d) {
return yScale(d.value);
})
.attr("height", function(d) {
return h - yScale(d.value);
})
</script>
</body>

关于javascript - 如何在 d3.js 中生成小倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828937/

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