【问题标题】:How to feed json object data into D3 charts(eg bubble chart, bar chart) in place of .JSON files?如何将 json 对象数据输入 D3 图表(例如气泡图、条形图)来代替 .JSON 文件?
【发布时间】:2016-09-06 21:17:34
【问题描述】:
  1. 我在 js 文件中有 json 对象(例如 MyFirstMashup.js),我 已将气泡图的脚本复制到同一个 js 文件中。在所有 网络上提供的示例,他们使用了 json 文件,例如。 flare.json、xyz.tsv 等。我不能像现在这样拥有这个文件 在 MyFirstMashup.js 文件中动态获取数据。相反我 已在我现有的 js 代码下方附加了气泡图代码。但 不幸的是,气泡图代码并没有特别适用于 data.json() 部分。我想我不必使用它,因为我已经 有 JSON 对象。如果不是,那么需要在 气泡图代码。带有气泡图的 MyFirstMashup.js 部分和json对象**(var jsonObj)**是---

    var jsonStr = JSON.stringify(matrix);
    var jsonObj = JSON.parse(jsonStr); //json对象

    var bubble = d3.layout.pack()
          .sort(null)
          .size([diameter, diameter])
          .padding(1.5);
    
    var svg = d3.select("body").append("svg")
          .attr("width", diameter)
          .attr("height", diameter)
          .attr("class", "bubble");
    
    d3.json("flare.json", function(error, root) { //hw to replace flare.json
        if (error) throw error;                   //with jsonObj(any json object)   
    
        var node = svg.selectAll(".node")
            .data(bubble.nodes(classes(root))
            .filter(function(d) { return !d.children; }))
          .enter().append("g")
            .attr("class", "node")
            .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
    
        node.append("title")
            .text(function(d) { return d.className + ": " + format(d.value); });
    
        node.append("circle")
            .attr("r", function(d) { return d.r; })
            .style("fill", function(d) { return color(d.packageName); });
    
        node.append("text")
            .attr("dy", ".3em")
            .style("text-anchor", "middle")
            .text(function(d) { return d.className.substring(0, d.r / 3); });
      });
    
     // Returns a flattened hierarchy containing all leaf nodes under the root.
      function classes(root) {
        var classes = [];
    
        function recurse(name, node) {
          if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
          else classes.push({packageName: name, className: node.name, value: node.size});
        }
    
        recurse(null, root);
        return {children: classes};
      }
    
      d3.select(self.frameElement).style("height", diameter + "px");
    

【问题讨论】:

    标签: javascript html json d3.js bubble-chart


    【解决方案1】:

    然后,您可以像这样创建一个渲染函数,而不是使用 d3.json 函数:

    var jsonStr = JSON.stringify(matrix);
    var jsonObj = JSON.parse(jsonStr); //json object
    
    var bubble = d3.layout.pack()
          .sort(null)
          .size([diameter, diameter])
          .padding(1.5);
    
    var svg = d3.select("body").append("svg")
          .attr("width", diameter)
          .attr("height", diameter)
          .attr("class", "bubble");
    
    render(jsonObj); // And simply call it like this.
    
    function render(root) {  
    
        var node = svg.selectAll(".node")
            .data(bubble.nodes(classes(root))
            .filter(function(d) { return !d.children; }))
          .enter().append("g")
            .attr("class", "node")
            .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
    
        node.append("title")
            .text(function(d) { return d.className + ": " + format(d.value); });
    
        node.append("circle")
            .attr("r", function(d) { return d.r; })
            .style("fill", function(d) { return color(d.packageName); });
    
        node.append("text")
            .attr("dy", ".3em")
            .style("text-anchor", "middle")
            .text(function(d) { return d.className.substring(0, d.r / 3); });
      };
    
    // Returns a flattened hierarchy containing all leaf nodes under the root.
      function classes(root) {
        var classes = [];
    
        function recurse(name, node) {
          if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
          else classes.push({packageName: name, className: node.name, value: node.size});
        }
    
        recurse(null, root);
        return {children: classes};
      }
    
    
    
      d3.select(self.frameElement).style("height", diameter + "px");
    

    或者去掉render函数直接使用.data(bubble.nodes(classes(jsonObj ))里面的jsonObj

    var jsonStr = JSON.stringify(matrix);
    var jsonObj = JSON.parse(jsonStr); //json object
    
    var bubble = d3.layout.pack()
          .sort(null)
          .size([diameter, diameter])
          .padding(1.5);
    
    var svg = d3.select("body").append("svg")
          .attr("width", diameter)
          .attr("height", diameter)
          .attr("class", "bubble");  
    
    var node = svg.selectAll(".node")
            .data(bubble.nodes(classes(jsonObj))
            .filter(function(d) { return !d.children; }))
          .enter().append("g")
            .attr("class", "node")
            .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
    
    node.append("title")
            .text(function(d) { return d.className + ": " + format(d.value); });
    
    node.append("circle")
            .attr("r", function(d) { return d.r; })
            .style("fill", function(d) { return color(d.packageName); });
    
    node.append("text")
            .attr("dy", ".3em")
            .style("text-anchor", "middle")
            .text(function(d) { return d.className.substring(0, d.r / 3); });
    
    
    // Returns a flattened hierarchy containing all leaf nodes under the root.
      function classes(root) {
        var classes = [];
    
        function recurse(name, node) {
          if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
          else classes.push({packageName: name, className: node.name, value: node.size});
        }
    
        recurse(null, root);
        return {children: classes};
      }
    
    
    
      d3.select(self.frameElement).style("height", diameter + "px");
    

    小提琴示例:http://jsfiddle.net/mzz9B/47/

    【讨论】:

    • 你的意思是删除整个 render() 并插入 .data(bubble.nodes(classes(jsonObj ))。如果是这样,我应该在哪里插入它。对不起,我很蹩脚,但我是一个总新手。
    • @RonnieDas 我已经更新了第二部分的答案
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多