gpt4 book ai didi

javascript - D3 - yAxis 刻度未显示

转载 作者:行者123 更新时间:2023-11-30 15:41:24 28 4
gpt4 key购买 nike

我正在做 D3 的基本条形图教程,但 yAxis 的刻度线没有显示,即使线显示了。这个问题被问了很多,但我仍然没有找到适合我具体情况的答案。这是我的代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>

.axis text {
font: 10px sans-serif;
}

.axis path,
.axis line {
fill: none;
stroke: #000000;
}

.x.axis path {
display: none;
}

.chart rect {
fill: steelblue;
}

.chart text {
fill: white;
font: 10px sans-serif;
text-anchor: end;
}

</style>

<svg class="chart"></svg>

<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="https://d3js.org/d3-array.v1.min.js"></script>
<script src="https://d3js.org/d3-collection.v1.min.js"></script>
<script src="https://d3js.org/d3-color.v1.min.js"></script>
<script src="https://d3js.org/d3-format.v1.min.js"></script>
<script src="https://d3js.org/d3-interpolate.v1.min.js"></script>
<script src="https://d3js.org/d3-time.v1.min.js"></script>
<script src="https://d3js.org/d3-time-format.v2.min.js"></script>
<script src="https://d3js.org/d3-scale.v1.min.js"></script>

<script>

var data = [4, 8, 15, 16, 23, 42];
var width = 960, height = 500
var barWidth = width / data.length

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

var chart = d3.select(".chart")
.attr('width', width)
.attr('height', height)

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

var groups = chart.selectAll(".bar")
.data(data)
.enter().append("g")
.attr('transform', (d, i) => `translate(${i * barWidth}, 0)`)

groups.append('rect')
.attr('y', (d) => yScale(d))
.attr('height', (d) => height - yScale(d))
.attr('width', barWidth - 1)

groups.append('text')
.attr('x', barWidth / 2)
.attr('height', (d) => height - yScale(d))
.attr('width', barWidth - 1)
.text(d => d)

</script>

有趣的事实:当我使用 axisBottom 而不是 axisLeft 附加轴时,我可以看到带有刻度的轴(显然方向不正确)。提前感谢您的帮助!

最佳答案

这里的问题是轴生成器创建了一个轴,调用时(使用 call),绘制在 0,0 位置:

Regardless of orientation, axes are always rendered at the origin.

因此,您需要平移 轴,将其向右移动一点:

chart.append("g")
.attr("class", "y axis")
.attr("transform", "translate(30,0)")//magic number, change it at will
.call(d3.axisLeft(yScale));

这是演示:

<style>

.axis text {
font: 10px sans-serif;
}

.axis path,
.axis line {
fill: none;
stroke: #000000;
}

.x.axis path {
display: none;
}

.chart rect {
fill: steelblue;
}

.barText {
fill: white;
font: 10px sans-serif;
text-anchor: end;
}

</style>

<svg class="chart"></svg>

<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="https://d3js.org/d3-array.v1.min.js"></script>
<script src="https://d3js.org/d3-collection.v1.min.js"></script>
<script src="https://d3js.org/d3-color.v1.min.js"></script>
<script src="https://d3js.org/d3-format.v1.min.js"></script>
<script src="https://d3js.org/d3-interpolate.v1.min.js"></script>
<script src="https://d3js.org/d3-time.v1.min.js"></script>
<script src="https://d3js.org/d3-time-format.v2.min.js"></script>
<script src="https://d3js.org/d3-scale.v1.min.js"></script>

<script>

var data = [4, 8, 15, 16, 23, 42];
var width = 500, height = 300
var barWidth = width / data.length

var yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d)])
.range([height - 10, 0])

var chart = d3.select(".chart")
.attr('width', width)
.attr('height', height)

var groups = chart.selectAll(".bar")
.data(data)
.enter().append("g")
.attr('transform', (d, i) => `translate(${i * barWidth + 30}, 0)`)

groups.append('rect')
.attr('y', (d) => yScale(d))
.attr('height', (d) => height - 10 - yScale(d))
.attr('width', barWidth - 1)

groups.append('text')
.attr("class", "barText")
.attr('x', barWidth / 2)
.attr('y', d=> yScale(d) + 16)
.attr('height', (d) => height - 10 - yScale(d))
.attr('width', barWidth - 1)
.text(d => d)

chart.append("g")
.attr("class", "y axis")
.attr("transform", "translate(30,0)")
.call(d3.axisLeft(yScale));

</script>

PS:你的代码还有一些问题,你可以改进(在这里,我只是回答你的问题):

  1. 您的代码缺少所有填充(左、右、上、下);
  2. 你应该使用一个标尺来定位x轴
  3. 您不需要计算条形宽度,bandwidth() 会自动计算。
  4. 模板文字不适用于 IE

关于javascript - D3 - yAxis 刻度未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40753501/

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