javascript - 酒吧堆积在一个地方
解决方案
@Samrat-附加rect
到您的svg
时,将代码中的这一行更改.attr("x"), function(d,i){return x(i)})
为.attr("x", (d, i) => i * (svgWidth / info.length))
. 此代码将整个 svg 宽度除以数据集的长度,并将每个值乘以其索引,从而使条形彼此保持距离。
希望这可以帮助。
小提琴供您参考:https ://jsfiddle.net/zfjcLopw/1/
注意:在发布关于 SO 的问题时,请遵循本文 https://stackoverflow.com/help/how-to-ask中列出的指南。这有助于及时获得答案。
这是更新的代码:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script src="https://d3js.org/d3.v5.min.js"></script>
</head>
<body>
<script>
const width = 600;
const height = 500;
const margin = { top: 100, right: 100, bottom: 100, left: 120 };
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const barPadding = 2;
const svg = d3
.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
const tag = ["mango", "banana", "apple", "lemon", "coconut"];
const info = [23, 54, 34, 51, 22];
const xScale = d3
.scaleBand()
.domain(tag.map(d => d))
.rangeRound([0, innerWidth]);
const yScale = d3
.scaleLinear()
.domain([0, d3.max(info, d => d)])
.range([innerHeight, 0]);
const mainG = svg
.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`);
const g = mainG
.selectAll("g")
.data(info)
.enter()
.append("g")
.attr("transform", `translate(0,0)`);
g.append("rect")
.attr("x", (d, i) => i * (innerWidth / info.length))
// .attr("x", (d, i) => xScale(i)) - This line will stack bars on top of each other
.attr("y", d => yScale(d))
.attr("width", innerWidth / info.length - barPadding)
.attr("height", d => innerHeight - yScale(d))
.attr("fill", "blue");
mainG.append("g").call(d3.axisLeft(yScale));
mainG
.append("g")
.call(d3.axisBottom(xScale))
.attr("transform", `translate(0, ${innerHeight})`);
</script>
</body>
</html>