呈现在JavaScript使用SVG和2D阵列从JSON条形图

问题描述 投票:0回答:1

已经度过最后2天通过计算器和网上的例子看,为什么我的图表显示不正常。

我敢肯定,我失去了一些东西在代码中的缩放部分的条款。如果我在X轴下方复制黑暗部分在图表上到记事本它给了我所有的X轴元素。

任何人都可以点我在正确的方向?

<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.8.0/d3.min.js"></script>
  <script>
    document.addEventListener('DOMContentLoaded',function(){
        req.open("GET",'https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json',true);
        req.send();
        req.onload=function(){
          json=JSON.parse(req.responseText);
          document.getElementsByClassName('title')[0].innerHTML=json.name;
          dataset=json.data;
          
          const w = 500;
          const h = 300;
          const padding = 10;
          
          // create an array with all date names
          const dates = dataset.map(function(d) {
              return d[0];
          });
          
          const xScale = d3.scaleBand()
                          .rangeRound([padding, w-padding])
                          .padding([.02])
                          .domain(dates);
          console.log("Scale Bandwidth: " + xScale.bandwidth());
          
          const yScale = d3.scaleLinear()
                          .rangeRound([h-padding, padding])          
                          .domain(0,d3.max(dataset, (d)=>d[1]));
          console.log("Dataset Max Height: " + d3.max(dataset, (d)=>d[1]));
          
          const xAxis = d3.axisBottom(xScale);
          const yAxis = d3.axisLeft(yScale);
                    
          const svg = d3.select("body")
                        .append("svg")
                        .attr("width", w)
                        .attr("height", h);
          
          svg.append("g")
             .attr("transform", "translate(0," + (h - padding) + ")")
             .call(xAxis);
          svg.append("g")
             .attr("transform", "translate(" + padding + ",0)")
             .call(yAxis);          
          
          svg.selectAll("rect")
                      .data(dataset)
                      .enter()
                      .append("rect")
                      .attr("width",(d,i)=>xScale.bandwidth())
                      .attr("height",(d,i)=>(h-yScale(d[1])))
                      .attr("x", (d,i)=>xScale(d[0]))
                      .attr("y", (d,i)=>yScale(d[1]))
                      .attr("fill", "navy")
                      .attr("class", "bar");
        };
    });    
  </script>
  <h1 class="title">Title Will Go Here</h1> 
</body>
javascript d3.js svg bar-chart
1个回答
0
投票

D3现在使用的承诺,而不是异步回调加载数据。承诺简化异步代码的结构,尤其是在支持异步和等待的现代浏览器。

Changes in D3 5.0

还有,你是正确的,你的yScale坏了。 Linear scales需要的范围和域,每个被传递一个2值数组。

    const yScale = d3.scaleLinear()
      .range([h - padding, padding])
      .domain([0, d3.max(dataset, (d) => d[1])]);

    document.addEventListener('DOMContentLoaded', async function() {

      const res = await d3.json("https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json");

      //console.log(res.data)
      const dataset = res.data

      const w = 500;
      const h = 300;
      const padding = 10;

      // create an array with all date names
      const dates = dataset.map(function(d) {
        return d[0];
      });
      
      const max = d3.max(dataset, function(d) { return d[1]} )

      const xScale = d3.scaleBand()
        .rangeRound([0, w]) 
        .padding([.02])
        .domain(dates);
      console.log("Scale Bandwidth: " + xScale.bandwidth());

      const yScale = d3.scaleLinear()
        .range([h - padding, padding])
        .domain([0, d3.max(dataset, (d) => d[1])]);
      console.log("Dataset Max Height: " + d3.max(dataset, (d) => d[1]));

      const xAxis = d3.axisBottom(xScale);
      const yAxis = d3.axisLeft(yScale);

      const svg = d3.select("body")
        .append("svg")
        .attr("width", w)
        .attr("height", h);

      svg.append("g")
        .attr("transform", "translate(0," + (h - padding) + ")")
        .call(xAxis);
      svg.append("g")
        .attr("transform", "translate(" + padding + ",0)")
        .call(yAxis);

      svg.selectAll("rect")
        .data(dataset)
        .enter()
        .append("rect")
        .attr("width", (d, i) => xScale.bandwidth())
        .attr("height", (d, i) => (h - yScale(d[1])) )
        .attr("x", (d, i) => xScale(d[0]))
        .attr("y", (d, i) => yScale(d[1]))
        .attr("fill", "navy")
        .attr("class", "bar");

    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.8.0/d3.min.js"></script>

Codepen

© www.soinside.com 2019 - 2024. All rights reserved.