首页 > 解决方案 > 酒吧堆积在一个地方

问题描述

谁能告诉我如何在一个特定位置堆叠的条之间提供间隙?这是代码:Ps:对不起,我试过了,但由于一些错误“请添加一些解释”,我没有将它作为代码片段发布

第1部分

第2部分

输出

标签: javascriptd3.js

解决方案


@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>

推荐阅读