From b5cce4d78d192ac32f74c549ba7e319b2b65b499 Mon Sep 17 00:00:00 2001 From: alvaro <alvaro@alia.(none)> Date: Tue, 23 Oct 2012 00:05:23 -0700 Subject: [PATCH] Adding D3CirclePacking --- .../Extension/Filter/D3circlepacking.php | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php b/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php new file mode 100644 index 00000000..62d8d4e3 --- /dev/null +++ b/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php @@ -0,0 +1,136 @@ +<?php + +class Haanga_Extension_Filter_D3CirclePacking{ + public $is_safe = TRUE; + static function main($obj, $varname){ + + $nodesArr = array(); + $n=0; + $first=""; + $nodes = array(); + $links = array(); + $names = explode(",", $varname); + $varList = array(); + $randId = uniqid("_ID_"); + + foreach($names as $v){ + if(strpos($v,"=")){ + break; + } + $variable['name'] = $v; + $variable['value'] = 'value'; + if(strpos($v, ".")){ + $aux = explode(".", $v); + $variable['name'] = $aux[0]; + $variable['value'] = $aux[1]; + } + $fieldCounter++; + $columnType = 'number'; + if($firstColumn){ + $columnType = 'string'; + $firstColumn = false; + } + array_push($varList, $variable); + //$data .= " data.addColumn('".$columnType."', '".$variable['name']."');\n"; + } + //options + $options = array(); + $options['width'] = 960; + $options['height'] = 500; + $options['color'] = '#aec7e8'; + $options['highlightedColor'] = '#00477f'; + $options['radius'] = 10; + $options['highlightedStrokeWidth'] = '3px'; + $options['strokeWidth'] = '1px'; + for($z=2; $z < count($names); $z++){ + $pair = explode("=", $names[$z]); + $key = trim($pair[0], "\" '"); + $value = trim($pair[1], "\" '"); + $options[$key] = $value; + } + + $maps = array(); + $quantities = array(); + $rootNode = NULL; + $id = $varList[0]['name']; + $quantity = $varList[2]['name']; + $parentId = $varList[1]['name']; + foreach($obj as $k){ + if(!isset($k->$parentId)){ + //root + $rootNode = $k->$id->value; + }else{ + if(!isset($maps[$k->$parentId->value])){ + $maps[$k->$parentId->value] = array(); + } + if(isset($k->$quantity)){ + $quantities[$k->$id->value] = $k->$quantity->value; + } + array_push($maps[$k->$parentId->value], $k->$id->value); + } + } + function travelCirclePacking($node, $tree, $quantities){ + $total = array(); + foreach($tree[$node] as $v){ + $branch = array(); + if(!isset($tree[$v])){ + if(isset($quantities[$v])){ + $branch['size'] = $quantities[$v]; + } + }else{ + $branch['children'] = travelCirclePacking($v, $tree, $quantities); + } + $branch['name'] = $v; + array_push($total, $branch); + } + return $total; + } + + $json['name'] = $rootNode; + $json['children'] = travelCirclePacking($rootNode, $maps, $quantities); + + + $pre = '<div id="clusterpacking'.$randId.'"><div id="name'.$randId.'" style="font-family:sans-serif;font-size:15px;height:25px"><h2> </h2></div></div><script src="http://d3js.org/d3.v2.min.js?2.9.3"></script> +<script> +// Based on http://bost.ocks.org/mike/treemap/ +function initD3CirclePacking'.$randId.'(json){ +var width = 960, + height = 600, + format = d3.format(",d"); + +var pack = d3.layout.pack() + .size([width - 4, height - 4]) + .value(function(d) { return d.size; }); + +var vis = d3.select("#clusterpacking'.$randId.'").append("svg") + .attr("width", width) + .attr("height", height) + .attr("class", "pack") + .append("g") + .attr("transform", "translate(2, 2)"); + + var node = vis.data([json]).selectAll("g.node") + .data(pack.nodes) + .enter().append("g") + .attr("class", function(d) { return d.children ? "node" : "leaf node"; }) + .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); + + node.append("title") + .text(function(d) { return d.name + (d.children ? "" : ": " + format(d.size)); }); + + node.append("circle") + .attr("r", function(d) { return d.r; }); + + node.filter(function(d) { return !d.children; }).append("text") + .attr("text-anchor", "middle") + .attr("dy", ".3em") + .text(function(d) { return d.name.substring(0, d.r / 3); }); + +} + +var jsonD3'.$randId.' = '.json_encode($json, JSON_NUMERIC_CHECK).'; +initD3CirclePacking'.$randId.'(jsonD3'.$randId.') +</script>'; + return $pre.$post; + } +} -- GitLab