A treemap recursively subdivides area into rectangles; the area of any node in the tree corresponds to its value.
-
-
Save johnpoole/4440061 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> | |
<title>Treemap - Neat Zoom Effect</title> | |
<script type="text/javascript" src="http://d3js.org/d3.v2.js"></script> | |
<style type="text/css"> | |
body { | |
background: url(./images/texture-noise.png); | |
overflow: hidden; | |
margin: 0; | |
font-size: 12px; | |
font-family: "Helvetica Neue", Helvetica; | |
} | |
#chart, #header, #footer { | |
position: absolute; | |
top: 0; | |
} | |
#header, #footer { | |
z-index: 1; | |
display: block; | |
font-size: 36px; | |
font-weight: 300; | |
text-shadow: 0 1px 0 #fff; | |
} | |
#header.inverted, #footer.inverted { | |
color: #fff; | |
text-shadow: 0 1px 4px #000; | |
} | |
#header { | |
top: 80px; | |
left: 140px; | |
width: 1200px; | |
} | |
#footer { | |
top: 680px; | |
right: 140px; | |
text-align: right; | |
} | |
rect { | |
pointer-events: all; | |
cursor: pointer; | |
} | |
.chart { | |
display: block; | |
margin: auto; | |
margin-top: 40px; | |
} | |
.parent .label { | |
color: #FFFFFF; | |
padding-left: 2px; | |
padding-top: 2px; | |
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
-webkit-text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
-moz-text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
} | |
.labelbody { | |
background: transparent; | |
} | |
.label { | |
padding: 2px; | |
white-space: pre; | |
overflow: hidden; | |
text-overflow: ellipsis; | |
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
-webkit-text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
-moz-text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); | |
} | |
.child .label { | |
white-space: pre-wrap; | |
text-align: center; | |
text-overflow: ellipsis; | |
} | |
.cell { | |
font-size: 11px; | |
cursor: pointer | |
} | |
</style> | |
</head> | |
<body> | |
<div id="body"></div> | |
<div id="footer"> | |
d3.layout.treemap | |
<div class="hint">click or option-click to descend or ascend</div> | |
<div> | |
<select> | |
<option value="size">Size</option> | |
<option value="count">Count</option> | |
</select> | |
</div> | |
<div class="chart" style="width: 1200px; height: 620px;"> | |
</div> | |
</div> | |
</body> | |
<script type="text/javascript"> | |
var chartWidth = 780 - 80; | |
var chartHeight = 800 - 180; | |
var xscale = d3.scale.linear().range([0, chartWidth]); | |
var yscale = d3.scale.linear().range([0, chartHeight]); | |
var color = d3.scale.category10(); | |
var headerHeight = 20; | |
var headerColor = "#555555"; | |
var transitionDuration = 500; | |
var root; | |
var node; | |
var jsonData = {"name": "RGH", | |
"children": [ | |
{"name": "AJN", | |
"children": [ | |
{"name": "06:00 12:00", "size":5}, | |
{"name": "07:00 15:00", "size":2}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":3}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":7}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "AN", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":5}, | |
{"name": "09:00 17:00", "size":4}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":6}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":4}, | |
{"name": "17:00 01:00", "size":4}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":4}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "CHD", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":1}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":1}, | |
{"name": "13:00 19:00", "size":5}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":6}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":6}, | |
{"name": "19:00 01:00", "size":7}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "CLS", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":7}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":9}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":1}, | |
{"name": "18:00 24:00", "size":3}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "COL", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":6}, | |
{"name": "09:00 17:00", "size":1}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":5}, | |
{"name": "11:00 17:00", "size":5}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":1}, | |
{"name": "18:00 24:00", "size":6}, | |
{"name": "19:00 01:00", "size":7}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "DAW", | |
"children": [ | |
{"name": "06:00 12:00", "size":6}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":3}, | |
{"name": "11:00 17:00", "size":8}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":5}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":5}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "DINA", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":4}, | |
{"name": "17:00 01:00", "size":8}, | |
{"name": "Fast2", "size":3}, | |
{"name": "18:00 24:00", "size":4}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":5}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "FYZ", | |
"children": [ | |
{"name": "06:00 12:00", "size":8}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":4}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":3}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":5}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":1}, | |
{"name": "Night2", "size":3} | |
] | |
} | |
, | |
{"name": "HECT", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":6}, | |
{"name": "09:00 17:00", "size":1}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":2}, | |
{"name": "13:00 19:00", "size":5}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":5}, | |
{"name": "Fast2", "size":1}, | |
{"name": "18:00 24:00", "size":5}, | |
{"name": "19:00 01:00", "size":3}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "JAS", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":3}, | |
{"name": "11:00 17:00", "size":1}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "JNIS", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":1}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":7}, | |
{"name": "17:00 01:00", "size":4}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":3}, | |
{"name": "19:00 01:00", "size":5}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":4} | |
] | |
} | |
, | |
{"name": "KND", | |
"children": [ | |
{"name": "06:00 12:00", "size":6}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":1}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":7}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":3}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "KHN", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":5}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":3}, | |
{"name": "11:00 17:00", "size":5}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":3}, | |
{"name": "18:00 24:00", "size":5}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "KRS", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":0}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":44} | |
] | |
} | |
, | |
{"name": "MUN", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":3}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":4}, | |
{"name": "13:00 19:00", "size":1}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":4}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":2} | |
] | |
} | |
, | |
{"name": "MYR", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":3}, | |
{"name": "09:00 17:00", "size":8}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":5}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":5}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "SAL", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":0}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":4}, | |
{"name": "Night1", "size":7}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "SCTT", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":3}, | |
{"name": "09:00 17:00", "size":4}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":2}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":6}, | |
{"name": "17:00 01:00", "size":2}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":6}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":5}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "B/W", | |
"children": [ | |
{"name": "06:00 12:00", "size":6}, | |
{"name": "07:00 15:00", "size":7}, | |
{"name": "09:00 17:00", "size":5}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":2}, | |
{"name": "Fast2", "size":3}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":4}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "CH/X", | |
"children": [ | |
{"name": "06:00 12:00", "size":7}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":5}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":2}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":4}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":3}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":3} | |
] | |
} | |
, | |
{"name": "C/O", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":4}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":5}, | |
{"name": "11:00 17:00", "size":4}, | |
{"name": "13:00 19:00", "size":1}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":2} | |
] | |
} | |
, | |
{"name": "F/R/C/P", | |
"children": [ | |
{"name": "06:00 12:00", "size":6}, | |
{"name": "07:00 15:00", "size":3}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":2}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":5}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":10}, | |
{"name": "Night1", "size":1}, | |
{"name": "Night2", "size":3} | |
] | |
} | |
, | |
{"name": "G/P", | |
"children": [ | |
{"name": "06:00 12:00", "size":7}, | |
{"name": "07:00 15:00", "size":5}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "H/B", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":8}, | |
{"name": "17:00 01:00", "size":5}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":2}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":2} | |
] | |
} | |
, | |
{"name": "HD/Z", | |
"children": [ | |
{"name": "06:00 12:00", "size":3}, | |
{"name": "07:00 15:00", "size":5}, | |
{"name": "09:00 17:00", "size":1}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":4}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":3}, | |
{"name": "17:00 01:00", "size":6}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":4}, | |
{"name": "Night1", "size":4}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "L/T", | |
"children": [ | |
{"name": "06:00 12:00", "size":4}, | |
{"name": "07:00 15:00", "size":2}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":1}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":5}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":6}, | |
{"name": "Night1", "size":1}, | |
{"name": "Night2", "size":3} | |
] | |
} | |
, | |
{"name": "M/H", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":3}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":4}, | |
{"name": "13:00 19:00", "size":6}, | |
{"name": "15:00 23:00", "size":3}, | |
{"name": "17:00 01:00", "size":5}, | |
{"name": "Fast2", "size":4}, | |
{"name": "18:00 24:00", "size":4}, | |
{"name": "19:00 01:00", "size":1}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "W/C/E", | |
"children": [ | |
{"name": "06:00 12:00", "size":1}, | |
{"name": "07:00 15:00", "size":3}, | |
{"name": "09:00 17:00", "size":4}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":4}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":2}, | |
{"name": "15:00 23:00", "size":8}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":1}, | |
{"name": "18:00 24:00", "size":3}, | |
{"name": "19:00 01:00", "size":3}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "Z/H/C1", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":6}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":5}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":3}, | |
{"name": "17:00 01:00", "size":3}, | |
{"name": "Fast2", "size":6}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":3}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":2} | |
] | |
} | |
, | |
{"name": "Z/H/C2", | |
"children": [ | |
{"name": "06:00 12:00", "size":4}, | |
{"name": "07:00 15:00", "size":2}, | |
{"name": "09:00 17:00", "size":9}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":5}, | |
{"name": "11:00 17:00", "size":3}, | |
{"name": "13:00 19:00", "size":3}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":2}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":6}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":4} | |
] | |
} | |
, | |
{"name": "ADM", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":13}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":0}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":3} | |
] | |
} | |
, | |
{"name": "CHNG", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":3}, | |
{"name": "Fast1", "size":2}, | |
{"name": "11:00 17:00", "size":6}, | |
{"name": "13:00 19:00", "size":4}, | |
{"name": "15:00 23:00", "size":2}, | |
{"name": "17:00 01:00", "size":2}, | |
{"name": "Fast2", "size":0}, | |
{"name": "18:00 24:00", "size":3}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":2}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "HUF", | |
"children": [ | |
{"name": "06:00 12:00", "size":2}, | |
{"name": "07:00 15:00", "size":5}, | |
{"name": "09:00 17:00", "size":2}, | |
{"name": "Call", "size":6}, | |
{"name": "Fast1", "size":1}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":3}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":1}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":1}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
, | |
{"name": "LAV", | |
"children": [ | |
{"name": "06:00 12:00", "size":0}, | |
{"name": "07:00 15:00", "size":0}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":0}, | |
{"name": "Fast1", "size":0}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":0}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":17}, | |
{"name": "18:00 24:00", "size":0}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "JSN", | |
"children": [ | |
{"name": "06:00 12:00", "size":3}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":4}, | |
{"name": "Fast1", "size":9}, | |
{"name": "11:00 17:00", "size":2}, | |
{"name": "13:00 19:00", "size":1}, | |
{"name": "15:00 23:00", "size":1}, | |
{"name": "17:00 01:00", "size":1}, | |
{"name": "Fast2", "size":2}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":4}, | |
{"name": "Night1", "size":0}, | |
{"name": "Night2", "size":0} | |
] | |
} | |
, | |
{"name": "WSH", | |
"children": [ | |
{"name": "06:00 12:00", "size":4}, | |
{"name": "07:00 15:00", "size":1}, | |
{"name": "09:00 17:00", "size":0}, | |
{"name": "Call", "size":2}, | |
{"name": "Fast1", "size":3}, | |
{"name": "11:00 17:00", "size":0}, | |
{"name": "13:00 19:00", "size":1}, | |
{"name": "15:00 23:00", "size":0}, | |
{"name": "17:00 01:00", "size":0}, | |
{"name": "Fast2", "size":1}, | |
{"name": "18:00 24:00", "size":2}, | |
{"name": "19:00 01:00", "size":0}, | |
{"name": "Night1", "size":3}, | |
{"name": "Night2", "size":1} | |
] | |
} | |
] } | |
; | |
var treemap = d3.layout.treemap() | |
.round(false) | |
.size([chartWidth, chartHeight]) | |
.sticky(true) | |
.padding([headerHeight + 1, 1, 1, 1]) | |
.value(function(d) { | |
return d.size; | |
}); | |
var chart = d3.select("#body").append("div") | |
.append("svg:svg") | |
.attr("width", chartWidth) | |
.attr("height", chartHeight) | |
.append("svg:g"); | |
node = root = jsonData; | |
var nodes = treemap.nodes(jsonData); | |
var children = nodes.filter(function(d) { | |
return !d.children; | |
}); | |
var parents = nodes.filter(function(d) { | |
return d.children; | |
}); | |
// create parent cells | |
var parentCells = chart.selectAll("g.cell.parent") | |
.data(parents, function(d) { | |
return "p-" + d.name; | |
}); | |
var parentEnterTransition = parentCells.enter() | |
.append("g") | |
.attr("class", "cell parent") | |
.on("click", function(d) { | |
zoom(d); | |
}); | |
parentEnterTransition.append("rect") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", headerHeight) | |
.style("fill", headerColor); | |
parentEnterTransition.append('foreignObject') | |
.attr("class", "foreignObject") | |
.append("xhtml:body") | |
.attr("class", "labelbody") | |
.append("div") | |
.attr("class", "label"); | |
// update transition | |
var parentUpdateTransition = parentCells.transition().duration(transitionDuration); | |
parentUpdateTransition.select(".cell") | |
.attr("transform", function(d) { | |
return "translate(" + d.dx + "," + d.y + ")"; | |
}); | |
parentUpdateTransition.select("rect") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", headerHeight) | |
.style("fill", headerColor); | |
parentUpdateTransition.select(".foreignObject") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", headerHeight) | |
.select(".labelbody .label") | |
.attr("style", function(d) { | |
return "width:" + Math.max(0.01, (d.dx - 1)) + "px;" + | |
"height:" + headerHeight + "px;"; | |
}) | |
.text(function(d) { | |
return d.name; | |
}); | |
// remove transition | |
parentCells.exit() | |
.remove(); | |
// create children cells | |
var childrenCells = chart.selectAll("g.cell.child") | |
.data(children, function(d) { | |
return "c-" + d.name; | |
}); | |
// enter transition | |
var childEnterTransition = childrenCells.enter() | |
.append("g") | |
.attr("class", "cell child") | |
.on("click", function(d) { | |
zoom(node === d.parent ? root : d.parent); | |
}); | |
childEnterTransition.append("rect") | |
.classed("background", true) | |
.style("fill", function(d) { | |
return color(d.parent.name); | |
}); | |
childEnterTransition.append('foreignObject') | |
.attr("class", "foreignObject") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", function(d) { | |
return Math.max(0.01, d.dy - 1); | |
}) | |
.style("display", "none") | |
.append("xhtml:body") | |
.attr("class", "labelbody") | |
.append("div") | |
.attr("class", "label") | |
.text(function(d) { | |
return d.name; | |
}); | |
// update transition | |
var childUpdateTransition = childrenCells.transition().duration(transitionDuration); | |
childUpdateTransition.select(".cell") | |
.attr("transform", function(d) { | |
return "translate(" + d.x + "," + d.y + ")"; | |
}); | |
childUpdateTransition.select("rect") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", function(d) { | |
return (d.dy - 1); | |
}) | |
.style("fill", function(d) { | |
return color(d.parent.name); | |
}); | |
childUpdateTransition.select(".foreignObject") | |
.attr("width", function(d) { | |
return Math.max(0.01, d.dx - 1); | |
}) | |
.attr("height", function(d) { | |
return Math.max(0.01, d.dy - 1); | |
}) | |
.select(".labelbody .label") | |
.attr("style", function(d) { | |
return "width:" + Math.max(0.01, (d.dx - 1)) + "px;" + | |
"height:" + (d.dy - 1) + "px;"; | |
}) | |
.text(function(d) { | |
return d.name; | |
}); | |
// exit transition | |
childrenCells.exit() | |
.remove(); | |
d3.select("select").on("change", function() { | |
console.log("select zoom(node)"); | |
treemap.value(this.value == "size" ? size : count) | |
.nodes(root); | |
zoom(node); | |
}); | |
zoom(node); | |
function size(d) { | |
return d.size; | |
} | |
function count(d) { | |
return 1; | |
} | |
//and another one | |
function textHeight(d) { | |
var ky = chartHeight / d.dy; | |
yscale.domain([d.y, d.y + d.dy]); | |
return (ky * d.dy) / headerHeight; | |
} | |
function getRGBComponents (color) { | |
var r = color.substring(1, 3); | |
var g = color.substring(3, 5); | |
var b = color.substring(5, 7); | |
return { | |
R: parseInt(r, 16), | |
G: parseInt(g, 16), | |
B: parseInt(b, 16) | |
}; | |
} | |
function idealTextColor (bgColor) { | |
var nThreshold = 105; | |
var components = getRGBComponents(bgColor); | |
var bgDelta = (components.R * 0.299) + (components.G * 0.587) + (components.B * 0.114); | |
return ((255 - bgDelta) < nThreshold) ? "#000000" : "#ffffff"; | |
} | |
function zoom(d) { | |
this.treemap | |
.padding([headerHeight/(chartHeight/d.dy), 0, 0, 0]) | |
.nodes(d); | |
// moving the next two lines above treemap layout messes up padding of zoom result | |
var kx = chartWidth / d.dx; | |
var ky = chartHeight / d.dy; | |
var level = d; | |
xscale.domain([d.x, d.x + d.dx]); | |
yscale.domain([d.y, d.y + d.dy]); | |
if (node != level) { | |
chart.selectAll(".cell.child .foreignObject").style("display", "none"); | |
} | |
var zoomTransition = chart.selectAll("g.cell").transition().duration(transitionDuration) | |
.attr("transform", function(d) { | |
return "translate(" + xscale(d.x) + "," + yscale(d.y) + ")"; | |
}) | |
.each("start", function() { | |
d3.select(this).select("label") | |
.style("display", "none"); | |
}) | |
.each("end", function(d, i) { | |
if (!i && (level !== self.root)) { | |
chart.selectAll(".cell.child") | |
.filter(function(d) { | |
return d.parent === self.node; // only get the children for selected group | |
}) | |
.select(".foreignObject") | |
.style("display", "") | |
.style("color", function(d) { | |
return idealTextColor(color(d.parent.name)); | |
}); | |
} | |
}); | |
zoomTransition.select(".foreignObject") | |
.attr("width", function(d) { | |
return Math.max(0.01, kx * d.dx - 1); | |
}) | |
.attr("height", function(d) { | |
return d.children ? headerHeight: Math.max(0.01, ky * d.dy - 1); | |
}) | |
.select(".labelbody .label") | |
.attr("style", function(d) { | |
return "width:" + Math.max(0.01, (kx * d.dx - 1)) + "px;" + | |
"height:" + (d.children ? headerHeight + "px": ky * d.dy - 1 + "px;"); | |
}) | |
.text(function(d) { | |
return d.name; | |
}); | |
// update the width/height of the rects | |
zoomTransition.select("rect") | |
.attr("width", function(d) { | |
return Math.max(0.01, kx * d.dx - 1); | |
}) | |
.attr("height", function(d) { | |
return d.children ? headerHeight : Math.max(0.01, ky * d.dy - 1); | |
}) | |
.style("fill", function(d) { | |
return d.children ? headerColor : color(d.parent.name); | |
}); | |
node = d; | |
if (d3.event) { | |
d3.event.stopPropagation(); | |
} | |
} | |
</script> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment