如何将json对象数据输入D3图表(如气泡图、条形图)来代替.json文件

How to feed json object data into D3 charts(eg bubble chart, bar chart) in place of .JSON files?

本文关键字:json 条形图 文件 对象 数据 输入 图表 D3 气泡      更新时间:2023-09-26
  1. 我在一个js文件中有json对象(例如MyFirstMashup.js(在同一个js文件中复制了气泡图的脚本。总之在web上可用的示例中,他们使用了json文件。flare.json、xyz.tsv等。我现在负担不起这个文件在MyFirstMashup.js文件中动态获取数据。相反,我在我现有的js代码下面附上了气泡图代码。但是不幸的是,气泡图代码在data.json((部分。我想我不必使用这个,因为我已经具有JSON对象。如果没有,则需要在气泡图代码。带有气泡图的MyFirstMashup.jspart和json对象**(var jsonObj(**是---

    var jsonStr=JSON.stringfy(矩阵(
    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");
    

然后,您可以创建这样的渲染函数,而不是使用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/