【问题标题】:How can I make rects from JSON?如何从 JSON 制作矩形?
【发布时间】:2021-11-02 12:42:14
【问题描述】:

我正在做一个项目来学习 d3 可视化 而且我的堆栈记录没有出现。你能帮帮我吗?

我尝试为数据放置一个简单的数组,它成功了,我只能翻转 y, 但是有了这个 JSON 数据。没有任何作用

https://codepen.io/DeanWinchester88/pen/XWgjjeW

let dataSet;
let data;
function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}
//usage: 
readTextFile("https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json", function(text){
    data = JSON.parse(text);
      dataSet = data["data"]
    console.log(dataSet);
});

const w = 700;
const h = 500;

const svg = d3.select("body")
  .append("svg")
  .attr("width",w)
  .attr("heigth",h)
  .attr("style", "outline: thin solid red;");

svg.selectAll("rect")
  .data(dataSet)
  .enter()
       .append("rect")
       .attr("x", (d,i) => d[1][i]+ 10)
       .attr("y", (d, i) => 0 )
       .attr("width", 25)
       .attr("height", (d, i) => d[1] /2 )
       .attr("fill", "navy")
       .attr("class", "bar")
       .append("title")
       .text((d) => d)

  svg.selectAll("text")
       .data(dataSet)
       .enter()
       .append("text")
       .text((d) => d)
       .attr("x", (d, i) => i * 30 +10)
       .attr("y", (d, i) => 15)

【问题讨论】:

    标签: javascript svg d3.js


    【解决方案1】:

    问题在于XMLHttpRequest 是异步的,您在传递给readTextFile 的回调之外定义d3 逻辑。最简单的解决方案是在回调中包含 d3 逻辑:

    readTextFile("https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json", function(text){
        data = JSON.parse(text);
          dataSet = data["data"]
        console.log(dataSet);
        // Add d3 logic here
        const w = 700;
    const h = 500;
    
    const svg = d3.select("body")
      .append("svg")
      .attr("width",w)
      .attr("heigth",h)
      .attr("style", "outline: thin solid red;");
    
    svg.selectAll("rect")
      .data(dataSet)
      .enter()
           .append("rect")
            // Changed this line to remove the [i]
           .attr("x", (d,i) => d[1] + 10)
           .attr("y", (d, i) => 0 )
           .attr("width", 25)
           .attr("height", (d, i) => d[1] /2 )
           .attr("fill", "navy")
           .attr("class", "bar")
           .append("title")
           .text((d) => d)
    
      svg.selectAll("text")
           .data(dataSet)
           .enter()
           .append("text")
           .text((d) => d)
           .attr("x", (d, i) => i * 30 +10)
           .attr("y", (d, i) => 15)
    
    });
    

    为避免回调,您可以将对readTextFile 的响应包装在Promise 中,然后使用async/awaitdataSet = await readTextFile(...)

    【讨论】:

    • 天哪,你很棒。谢谢。至于避免回调,我几天前刚刚在 freecodecamp 开始了 d3 api,所以它对我来说太高了。谢谢
    • 没问题。享受 d3 的乐趣,它是一个很棒的库。
    猜你喜欢
    • 2014-07-17
    • 2023-03-30
    • 2020-04-12
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多