gpt4 book ai didi

d3.js - 当所有值都为 0 时,零刻度在轴上垂直居中

转载 作者:行者123 更新时间:2023-12-05 00:47:33 25 4
gpt4 key购买 nike

我注意到从 d3 版本 4 更新到版本 5 时行为发生了变化。在 v4 中,当数据集包含所有 y 轴的零值时,“0”刻度正确对齐到 图表底部

<head>
<!-- load the d3.js library -->
<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
.line {
fill: none;
stroke: steelblue;
stroke-width: 2px;
}
</style>
</head>

<script>
var margin = {
top: 50,
right: 50,
bottom: 50,
left: 50
},
width = window.innerWidth - margin.left - margin.right,
height = window.innerHeight - margin.top - margin.bottom;

var n = 21;
// An array of objects of length N. Each object has key -> value pair, the key being "y" and the value is a random number
// var dataset = d3.range(n).map(function(d) { return {"y": d3.randomUniform(1)() } })
var dataset = d3.range(n).map(function(d) {
return {
"y": 0
}
})

var xScale = d3.scaleLinear()
.domain([0, n - 1])
.range([0, width]);

var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, d => d.y)])
.range([height, 0]);

var line = d3.line()
.x(function(d, i) {
return xScale(i);
})
.y(function(d) {
return yScale(d.y);
})
.curve(d3.curveMonotoneX)

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale));

svg.append("g")
.attr("class", "y axis")
.call(d3.axisLeft(yScale));

svg.append("path")
.datum(dataset)
.attr("class", "line")
.attr("d", line);
</script>

对于我的用例,这是预期的行为。

在v5中,相同条件下,“0”对齐y轴的中心

<head>
<!-- load the d3.js library -->
<script src="https://d3js.org/d3.v5.min.js"></script>
<style>
.line {
fill: none;
stroke: steelblue;
stroke-width: 2px;
}
</style>
</head>

<script>
var margin = {top: 50, right: 50, bottom: 50, left: 50}
, width = window.innerWidth - margin.left - margin.right
, height = window.innerHeight - margin.top - margin.bottom;

var n = 21;
// An array of objects of length N. Each object has key -> value pair, the key being "y" and the value is a random number
// var dataset = d3.range(n).map(function(d) { return {"y": d3.randomUniform(1)() } })
var dataset = d3.range(n).map(function(d) { return {"y": 0 } })

var xScale = d3.scaleLinear()
.domain([0, n-1])
.range([0, width]);

var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, d => d.y)])
.range([height, 0]);

var line = d3.line()
.x(function(d, i) { return xScale(i); })
.y(function(d) { return yScale(d.y); })
.curve(d3.curveMonotoneX)

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale));

svg.append("g")
.attr("class", "y axis")
.call(d3.axisLeft(yScale));

svg.append("path")
.datum(dataset)
.attr("class", "line")
.attr("d", line);
</script>

两个示例之间的唯一区别是加载的 d3 版本。

有什么方法可以在 d3 的当前版本 (v5) 中保持 v4 中表现出的相同行为?

最佳答案

不是 D3 v4 和 v5 之间的区别。实际上,这种变化是在 D3 v5.8 中引入的。

看看这里,这是您使用 D3 v5.7 的代码:

<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.js"></script>
<style>
.line {
fill: none;
stroke: steelblue;
stroke-width: 2px;
}

</style>
</head>

<script>
var margin = {
top: 50,
right: 50,
bottom: 50,
left: 50
},
width = window.innerWidth - margin.left - margin.right,
height = window.innerHeight - margin.top - margin.bottom;

var n = 21;
// An array of objects of length N. Each object has key -> value pair, the key being "y" and the value is a random number
// var dataset = d3.range(n).map(function(d) { return {"y": d3.randomUniform(1)() } })
var dataset = d3.range(n).map(function(d) {
return {
"y": 0
}
})

var xScale = d3.scaleLinear()
.domain([0, n - 1])
.range([0, width]);

var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, d => d.y)])
.range([height, 0]);

var line = d3.line()
.x(function(d, i) {
return xScale(i);
})
.y(function(d) {
return yScale(d.y);
})
.curve(d3.curveMonotoneX)

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale));

svg.append("g")
.attr("class", "y axis")
.call(d3.axisLeft(yScale));

svg.append("path")
.datum(dataset)
.attr("class", "line")
.attr("d", line);

</script>

现在相同的代码,使用 D3 v5.8:

<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.8.0/d3.js"></script>
<style>
.line {
fill: none;
stroke: steelblue;
stroke-width: 2px;
}

</style>
</head>

<script>
var margin = {
top: 50,
right: 50,
bottom: 50,
left: 50
},
width = window.innerWidth - margin.left - margin.right,
height = window.innerHeight - margin.top - margin.bottom;

var n = 21;
// An array of objects of length N. Each object has key -> value pair, the key being "y" and the value is a random number
// var dataset = d3.range(n).map(function(d) { return {"y": d3.randomUniform(1)() } })
var dataset = d3.range(n).map(function(d) {
return {
"y": 0
}
})

var xScale = d3.scaleLinear()
.domain([0, n - 1])
.range([0, width]);

var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, d => d.y)])
.range([height, 0]);

var line = d3.line()
.x(function(d, i) {
return xScale(i);
})
.y(function(d) {
return yScale(d.y);
})
.curve(d3.curveMonotoneX)

var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale));

svg.append("g")
.attr("class", "y axis")
.call(d3.axisLeft(yScale));

svg.append("path")
.datum(dataset)
.attr("class", "line")
.attr("d", line);

</script>

解释可以在release notes上找到对于 D3 v5.8:

D3-Scale:

For collapsed domains, use midpoint of domain or range rather than start. (emphases mine)

因此,恐怕您无能为力,除非回到 D3 v5.7 或更低版本。

事实上,D3 v5.8 与 v5.7 有很大的不同(并且不向后兼容,例如,请参阅新的规模构造函数或新的 join 方法),以我的拙见它应该被命名为 D3 v6.0(当然,按照语义版本控制,它仍然被命名为 v5,因为没有重大更改)。可以说,从 v5.7 到 v5.8 的差异比从 v4 到 v5 的差异更多。

关于d3.js - 当所有值都为 0 时,零刻度在轴上垂直居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56645624/

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