3

D3 新手...

我正在尝试复制一个简单的示例,但使用来自 mysql 的数据。由于我将列重命名为“名称”和“大小”,因此应该很容易过渡。我认为该行/项目!d.children;限制了要处理的数据或我的代码错误。

如何向现有的 .json 添加一个类

或者

我需要删除哪些代码才能使现有的 .json 工作?

<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var diameter = 960,
    format = d3.format(",d"),
    color = d3.scale.category20c();

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("json.php", function(error, 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");

</script>

json.php

<?php
$username = "homedbuser"; 
$password = "homedbuser";   
$host = "localhost";
$database="homedb";

$server = mysql_connect($host, $username, $password);
$connection = mysql_select_db($database, $server);

$myquery = "
SELECT  `name`, `size` FROM  `lists`
";
    $query = mysql_query($myquery);

    if ( ! $myquery ) {
        echo mysql_error();
        die;
    }

    $data = array();

    for ($x = 0; $x < mysql_num_rows($query); $x++) {
        $data[] = mysql_fetch_assoc($query);
    }

    echo json_encode($data);     

    mysql_close($server);
?>

此外,我认为脚本中存在错误root(假设是数据)。我将继续通过我的研究更新代码,直到有回复为止。

4

1 回答 1

2

您正在尝试的图表要求数据采用分层格式。通过您给出的查询,数据似乎不是层次结构。

我使用了 csv 数据,但没关系,我已经给出了我在链接中给出的图表的格式。

编写您的 SQL 查询以获取以下格式的数据并使用 d3.json 并导入 php 文件,一切都应该正常。

我已经粘贴了所有代码和示例数据。

这可能会帮助你。任何问题也请提供示例数据。

数据:

    名称、尺寸
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    1,23 级
    2,23级
    2,23级
    2,23级
    2,23级
    2,23级
    2,23级
    2,23级
    2,23级
    2,23级

用于转换为层次结构的函数:

    d3.csv(“data.csv”,函数(根){

                var newData = { name :"root", children : [] },
                    级别= [“名称”];

                // 对于每个数据行,遍历输出树的预期级别
                root.forEach(函数(d){
                    // 将此作为对当前级别的参考
                    var depthCursor = newData.children;
                    // 一次下一层
                    levels.forEach(函数(属性,深度){

                        // 查看是否已经创建了一个分支
                        变量索引;
                        depthCursor.forEach(function(child,i){
                            if ( d[property] == child.name ) index = i;
                        });
                        // 如果不存在则添加一个分支
                        if ( isNaN(index) ) {
                            depthCursor.push({ name : d[property], children : []});
                            index = depthCursor.length - 1;
                        }
                        // 现在在我们深入树时引用新的子数组
                        depthCursor = depthCursor[index].children;
                        // 这是一个叶子,所以将最后一个元素添加到指定分支
                        if ( depth === levels.length - 1 ) depthCursor.push({ name : d.name, size : d.size });
                    });
                });

                //打印我们得到的
                d3.select('body').append('pre')
                           .text(JSON.stringify(newData, null, ' '));
            })

通过结合这两个函数编写脚本:

    var 直径 = 960,
        格式 = d3.format(",d"),
        颜色 = d3.scale.category20c();

    var 气泡 = d3.layout.pack()
        .sort(null)
        .size([直径,直径])
        .padding(1.5);

    var svg = d3.select("body").append("svg")
        .attr("宽度", 直径)
        .attr(“高度”,直径)
        .attr("class", "bubble");

    d3.json("yourphpfile.php", function(error, data) {
        var root = { name :"root", children : [] },
                    级别= [“名称”];

                // 对于每个数据行,遍历输出树的预期级别
                data.forEach(函数(d){
                    // 将此作为对当前级别的参考
                    var depthCursor = root.children;
                    // 一次下一层
                    levels.forEach(函数(属性,深度){

                        // 查看是否已经创建了一个分支
                        变量索引;
                        depthCursor.forEach(function(child,i){
                            if ( d[property] == child.name ) index = i;
                        });
                        // 如果不存在则添加一个分支
                        if ( isNaN(index) ) {
                            depthCursor.push({ name : d[property], children : []});
                            index = depthCursor.length - 1;
                        }
                        // 现在在我们深入树时引用新的子数组
                        depthCursor = depthCursor[index].children;
                        // 这是一个叶子,所以将最后一个元素添加到指定分支
                        if ( depth === levels.length - 1 ) depthCursor.push({ name : d.name, size : d.size });
                    });
                });


      var node = svg.selectAll(".node")
          .data(bubble.nodes(类(根))
          .filter(function(d) { return !d.children; }))
        .enter().append("g")
          .attr(“类”,“节点”)
          .attr("变换", function(d) { return "translate(" + dx + "," + dy + ")"; });

      node.append("标题")
          .text(function(d) { return d.className + ":" + format(d.value); });

      node.append("圆")
          .attr("r", function(d) { return dr; })
          .style("fill", function(d) { return color(d.packageName); });

      node.append("文本")
          .attr("dy", ".3em")
          .style("文本锚", "中间")
          .text(function(d) { return d.className.substring(0, dr / 3); });
    });

    // 返回一个扁平的层次结构,其中包含根下的所有叶节点。
    函数类(根){
      变量类 = [];

      函数递归(名称,节点){
        if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
        else classes.push({packageName: name, className: node.name, value: node.size});
      }

      递归(空,根);
      返回{儿童:类};
    }

    d3.select(self.frameElement).style("height", 直径 + "px");

于 2013-11-15T07:40:17.527 回答