as first seen from https://www.jasondavies.com/parallel-sets/
Last active
August 29, 2015 13:57
-
-
Save danharr/9834558 to your computer and use it in GitHub Desktop.
Web Site Visits (via Jason Davies)
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
.dimension { cursor: ns-resize; } | |
.category { cursor: ew-resize; } | |
.dimension tspan.name { font-size: 1.5em; fill: #333; font-weight: bold; } | |
.dimension tspan.sort { fill: #000; cursor: pointer; opacity: 0; } | |
.dimension tspan.sort:hover { fill: #333; } | |
.dimension:hover tspan.name { fill: #000; } | |
.dimension:hover tspan.sort { opacity: 1; } | |
line { stroke: #000; } | |
rect { fill: #fff; fill-opacity: 0; } | |
.dimension rect, .category rect { stroke: none; } | |
.dimension > rect { display: none; } | |
.category:hover rect { fill-opacity: .3; } | |
.dimension:hover > rect { fill-opacity: .3; } | |
path { fill-opacity: .5; } | |
.ribbon path { stroke-opacity: 0; } | |
path.active { fill-opacity: .9; } | |
.ribbon-mouse path { fill-opacity: 0; } | |
.category-0 { fill: #1f77b4; stroke: #1f77b4; } | |
.category-1 { fill: #74DF00; stroke: #74DF00; } | |
.category-2 { fill: #DF0101; stroke: #DF0101; } | |
.category-3 { fill: #A901DB; stroke: #A901DB; } | |
.category-4 { fill: #9467bd; stroke: #9467bd; } | |
.category-5 { fill: #8c564b; stroke: #8c564b; } | |
.category-6 { fill: #e377c2; stroke: #e377c2; } | |
.category-7 { fill: #7f7f7f; stroke: #7f7f7f; } | |
.category-8 { fill: #bcbd22; stroke: #bcbd22; } | |
.category-9 { fill: #17becf; stroke: #17becf; } |
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
// Parallel Sets by Jason Davies, http://www.jasondavies.com/ | |
// Functionality based on http://eagereyes.org/parallel-sets | |
(function() { | |
d3.parsets = function() { | |
var event = d3.dispatch("sortDimensions", "sortCategories"), | |
dimensions_ = autoDimensions, | |
dimensionFormat = String, | |
sortCategories = null, | |
value_, | |
spacing = 20, | |
width, | |
height, | |
tension = 1, | |
tension0, | |
duration = 500; | |
function parsets(selection) { | |
selection.each(function(data, i) { | |
var g = d3.select(this), | |
ordinal = d3.scale.ordinal(), | |
dragging = false, | |
dimensionNames = dimensions_.call(this, data, i), | |
dimensions = [], | |
tree = {children: {}, count: 0}, | |
nodes, | |
total, | |
ribbon; | |
d3.select(window).on("mousemove.parsets." + ++parsetsId, unhighlight); | |
if (tension0 == null) tension0 = tension; | |
g.selectAll(".ribbon, .ribbon-mouse") | |
.data(["ribbon", "ribbon-mouse"], String) | |
.enter().append("g") | |
.attr("class", String); | |
updateDimensions(); | |
if (tension != tension0) { | |
var t = d3.transition(g); | |
if (t.tween) t.tween("ribbon", tensionTween); | |
else tensionTween()(1); | |
} | |
function tensionTween() { | |
var i = d3.interpolateNumber(tension0, tension); | |
return function(t) { | |
tension0 = i(t); | |
ribbon.attr("d", ribbonPath); | |
}; | |
} | |
function updateDimensions() { | |
// Cache existing bound dimensions to preserve sort order. | |
var dimension = g.selectAll("g.dimension"), | |
cache = {}; | |
dimension.each(function(d) { cache[d.name] = d; }); | |
dimensionNames.forEach(function(d) { | |
if (!cache.hasOwnProperty(d)) { | |
cache[d] = {name: d, categories: []}; | |
} | |
dimensions.push(cache[d]); | |
}); | |
dimensions.sort(function(a, b) { return ascendingNaN(a.y, b.y); }); | |
// Populate tree with existing nodes. | |
g.select(".ribbon").selectAll("path") | |
.each(function(d) { | |
var path = d.path.split("\0"), | |
node = tree, | |
n = path.length - 1; | |
for (var i = 0; i < n; i++) { | |
var p = path[i]; | |
node = node.children.hasOwnProperty(p) ? node.children[p] | |
: node.children[p] = {children: {}, count: 0}; | |
} | |
node.children[d.name] = d; | |
}); | |
tree = buildTree(tree, data, dimensions.map(function(d) { return d.name; }), value_); | |
cache = dimensions.map(function(d) { | |
var t = {}; | |
d.categories.forEach(function(c) { | |
t[c.name] = c; | |
}); | |
return t; | |
}); | |
(function categories(d, i) { | |
if (!d.children) return; | |
var dim = dimensions[i], | |
t = cache[i]; | |
for (var k in d.children) { | |
if (!t.hasOwnProperty(k)) { | |
dim.categories.push(t[k] = {name: k}); | |
} | |
categories(d.children[k], i + 1); | |
} | |
})(tree, 0); | |
ordinal.domain([]).range(d3.range(dimensions[0].categories.length)); | |
nodes = layout(tree, dimensions, ordinal); | |
total = getTotal(dimensions); | |
dimension = dimension.data(dimensions, dimensionName); | |
var dEnter = dimension.enter().append("g") | |
.attr("class", "dimension") | |
.attr("transform", function(d) { return "translate(0," + d.y + ")"; }) | |
.on("mousedown", cancelEvent) | |
.each(function(d) { | |
d.y0 = d.y; | |
d.categories.forEach(function(d) { d.x0 = d.x; }); | |
}); | |
dEnter.append("rect") | |
.attr("width", width) | |
.attr("y", -45) | |
.attr("height", 45); | |
var textEnter = dEnter.append("text") | |
.attr("class", "dimension") | |
.attr("transform", "translate(0,-25)"); | |
textEnter.append("tspan") | |
.attr("class", "name") | |
.text(dimensionFormatName); | |
textEnter.append("tspan") | |
.attr("class", "sort alpha") | |
.attr("dx", "2em") | |
.text("alpha »") | |
.on("mousedown", cancelEvent); | |
textEnter.append("tspan") | |
.attr("class", "sort size") | |
.attr("dx", "2em") | |
.text("size »") | |
.on("mousedown", cancelEvent); | |
dimension | |
.call(d3.behavior.drag() | |
.origin(identity) | |
.on("dragstart", function(d) { | |
dragging = true; | |
d.y0 = d.y; | |
}) | |
.on("drag", function(d) { | |
d.y0 = d.y = d3.event.y; | |
for (var i = 1; i < dimensions.length; i++) { | |
if (dimensions[i].y < dimensions[i - 1].y) { | |
dimensions.sort(function(a, b) { return a.y - b.y; }); | |
dimensionNames = dimensions.map(function(d) { return d.name; }); | |
ordinal.domain([]).range(d3.range(dimensions[0].categories.length)); | |
nodes = layout(tree = buildTree({children: {}, count: 0}, data, dimensionNames, value_), dimensions, ordinal); | |
total = getTotal(dimensions); | |
g.selectAll(".ribbon, .ribbon-mouse").selectAll("path").remove(); | |
updateRibbons(); | |
updateCategories(dimension); | |
dimension.transition().duration(duration) | |
.attr("transform", function(d) { return "translate(0," + d.y + ")"; }) | |
.tween("ribbon", ribbonTweenY); | |
event.sortDimensions(); | |
break; | |
} | |
} | |
d3.select(this) | |
.attr("transform", "translate(0," + d.y + ")") | |
.transition(); | |
ribbon.filter(function(r) { return r.source.dimension === d || r.target.dimension === d; }) | |
.attr("d", ribbonPath); | |
}) | |
.on("dragend", function(d) { | |
dragging = false; | |
unhighlight(); | |
var y0 = 45, | |
dy = (height - y0 - 2) / (dimensions.length - 1); | |
dimensions.forEach(function(d, i) { | |
d.y = y0 + i * dy; | |
}); | |
transition(d3.select(this)) | |
.attr("transform", "translate(0," + d.y + ")") | |
.tween("ribbon", ribbonTweenY); | |
})); | |
dimension.select("text").select("tspan.sort.alpha") | |
.on("click", sortBy("alpha", function(a, b) { return a.name < b.name ? 1 : -1; }, dimension)); | |
dimension.select("text").select("tspan.sort.size") | |
.on("click", sortBy("size", function(a, b) { return a.count - b.count; }, dimension)); | |
dimension.transition().duration(duration) | |
.attr("transform", function(d) { return "translate(0," + d.y + ")"; }) | |
.tween("ribbon", ribbonTweenY); | |
dimension.exit().remove(); | |
updateCategories(dimension); | |
updateRibbons(); | |
} | |
function sortBy(type, f, dimension) { | |
return function(d) { | |
var direction = this.__direction = -(this.__direction || 1); | |
d3.select(this).text(direction > 0 ? type + " »" : "« " + type); | |
d.categories.sort(function() { return direction * f.apply(this, arguments); }); | |
nodes = layout(tree, dimensions, ordinal); | |
updateCategories(dimension); | |
updateRibbons(); | |
event.sortCategories(); | |
}; | |
} | |
function updateRibbons() { | |
ribbon = g.select(".ribbon").selectAll("path") | |
.data(nodes, function(d) { return d.path; }); | |
ribbon.enter().append("path") | |
.each(function(d) { | |
d.source.x0 = d.source.x; | |
d.target.x0 = d.target.x; | |
}) | |
.attr("class", function(d) { return "category-" + d.major; }) | |
.attr("d", ribbonPath); | |
ribbon.sort(function(a, b) { return b.count - a.count; }); | |
ribbon.exit().remove(); | |
var mouse = g.select(".ribbon-mouse").selectAll("path") | |
.data(nodes, function(d) { return d.path; }); | |
mouse.enter().append("path") | |
.on("mousemove", function(d) { | |
ribbon.classed("active", false); | |
if (dragging) return; | |
highlight(d = d.node, true); | |
var count = d.count, | |
path = [d.name]; | |
while ((d = d.parent) && d.name) path.unshift(d.name); | |
showTooltip(path.join(", ") + "<br>" + count + ", " + percent(count / total)); | |
d3.event.stopPropagation(); | |
}); | |
mouse | |
.sort(function(a, b) { return b.count - a.count; }) | |
.attr("d", ribbonPathStatic); | |
mouse.exit().remove(); | |
} | |
// Animates the x-coordinates only of the relevant ribbon paths. | |
function ribbonTweenX(d) { | |
var nodes = [d], | |
r = ribbon.filter(function(r) { | |
var s, t; | |
if (r.source.node === d) nodes.push(s = r.source); | |
if (r.target.node === d) nodes.push(t = r.target); | |
return s || t; | |
}), | |
i = nodes.map(function(d) { return d3.interpolateNumber(d.x0, d.x); }), | |
n = nodes.length; | |
return function(t) { | |
for (var j = 0; j < n; j++) nodes[j].x0 = i[j](t); | |
r.attr("d", ribbonPath); | |
}; | |
} | |
// Animates the y-coordinates only of the relevant ribbon paths. | |
function ribbonTweenY(d) { | |
var r = ribbon.filter(function(r) { return r.source.dimension.name == d.name || r.target.dimension.name == d.name; }), | |
i = d3.interpolateNumber(d.y0, d.y); | |
return function(t) { | |
d.y0 = i(t); | |
r.attr("d", ribbonPath); | |
}; | |
} | |
// Highlight a node and its descendants, and optionally its ancestors. | |
function highlight(d, ancestors) { | |
if (dragging) return; | |
var highlight = []; | |
(function recurse(d) { | |
highlight.push(d); | |
for (var k in d.children) recurse(d.children[k]); | |
})(d); | |
highlight.shift(); | |
if (ancestors) while (d) highlight.push(d), d = d.parent; | |
ribbon.filter(function(d) { | |
var active = highlight.indexOf(d.node) >= 0; | |
if (active) this.parentNode.appendChild(this); | |
return active; | |
}).classed("active", true); | |
} | |
// Unhighlight all nodes. | |
function unhighlight() { | |
if (dragging) return; | |
ribbon.classed("active", false); | |
hideTooltip(); | |
} | |
function updateCategories(g) { | |
var category = g.selectAll("g.category") | |
.data(function(d) { return d.categories; }, function(d) { return d.name; }); | |
var categoryEnter = category.enter().append("g") | |
.attr("class", "category") | |
.attr("transform", function(d) { return "translate(" + d.x + ")"; }) | |
category | |
.on("mousemove", function(d) { | |
ribbon.classed("active", false); | |
if (dragging) return; | |
d.nodes.forEach(function(d) { highlight(d); }); | |
showTooltip(d.name + "<br>" + d.count + ", " + percent(d.count / total)); | |
d3.event.stopPropagation(); | |
}) | |
.on("mouseout", unhighlight) | |
.on("mousedown", cancelEvent) | |
.call(d3.behavior.drag() | |
.origin(identity) | |
.on("dragstart", function(d) { | |
dragging = true; | |
d.x0 = d.x; | |
}) | |
.on("drag", function(d) { | |
d.x = d3.event.x; | |
var categories = d.dimension.categories; | |
for (var i = 0, c = categories[0]; ++i < categories.length;) { | |
if (c.x + c.dx / 2 > (c = categories[i]).x + c.dx / 2) { | |
categories.sort(function(a, b) { return a.x + a.dx / 2 - b.x - b.dx / 2; }); | |
nodes = layout(tree, dimensions, ordinal); | |
updateRibbons(); | |
updateCategories(g); | |
highlight(d.node); | |
event.sortCategories(); | |
break; | |
} | |
} | |
var x = 0, | |
p = spacing / (categories.length - 1); | |
categories.forEach(function(e, i) { | |
if (d === e) e.x0 = d3.event.x; | |
e.x = x; | |
x += e.count / total * (width - spacing) + p; | |
}); | |
d3.select(this) | |
.attr("transform", function(d) { return "translate(" + d.x0 + ")"; }) | |
.transition(); | |
ribbon.filter(function(r) { return r.source.node === d || r.target.node === d; }) | |
.attr("d", ribbonPath); | |
}) | |
.on("dragend", function(d) { | |
dragging = false; | |
unhighlight(); | |
updateRibbons(); | |
transition(d3.select(this)) | |
.attr("transform", "translate(" + d.x + ")") | |
.tween("ribbon", ribbonTweenX); | |
})); | |
category.transition().duration(duration) | |
.attr("transform", function(d) { return "translate(" + d.x + ")"; }) | |
.tween("ribbon", ribbonTweenX); | |
categoryEnter.append("rect") | |
.attr("width", function(d) { return d.dx; }) | |
.attr("y", -20) | |
.attr("height", 20); | |
categoryEnter.append("line") | |
.style("stroke-width", 2); | |
categoryEnter.append("text") | |
.attr("dy", "-.3em"); | |
category.select("rect") | |
.attr("class", function(d) { | |
return d.dimension === dimensions[0] ? "category-" + ordinal(d.name) : null; | |
}) | |
category.select("line") | |
.attr("x2", function(d) { return d.dx; }); | |
category.select("text") | |
.text(truncateText(function(d) { return d.name; }, function(d) { return d.dx; })); | |
} | |
}); | |
} | |
parsets.dimensionFormat = function(_) { | |
if (!arguments.length) return dimensionFormat; | |
dimensionFormat = _; | |
return parsets; | |
}; | |
parsets.dimensions = function(_) { | |
if (!arguments.length) return dimensions_; | |
dimensions_ = d3.functor(_); | |
return parsets; | |
}; | |
parsets.value = function(_) { | |
if (!arguments.length) return value_; | |
value_ = d3.functor(_); | |
return parsets; | |
}; | |
parsets.width = function(_) { | |
if (!arguments.length) return width; | |
width = +_; | |
return parsets; | |
}; | |
parsets.height = function(_) { | |
if (!arguments.length) return height; | |
height = +_; | |
return parsets; | |
}; | |
parsets.spacing = function(_) { | |
if (!arguments.length) return spacing; | |
spacing = +_; | |
return parsets; | |
}; | |
parsets.tension = function(_) { | |
if (!arguments.length) return tension; | |
tension = +_; | |
return parsets; | |
}; | |
parsets.duration = function(_) { | |
if (!arguments.length) return duration; | |
duration = +_; | |
return parsets; | |
}; | |
var body = d3.select("body"); | |
var tooltip = body.append("div") | |
.style("display", "none") | |
.style("background-color", "#eee") | |
.style("background-color", "rgba(242, 242, 242, .6)") | |
.style("padding", "5px") | |
.style("position", "absolute"); | |
return d3.rebind(parsets, event, "on").value(1).width(960).height(600); | |
function dimensionFormatName(d, i) { | |
return dimensionFormat.call(this, d.name, i); | |
} | |
function showTooltip(html) { | |
var m = d3.mouse(body.node()); | |
tooltip | |
.style("display", null) | |
.style("left", m[0] + 30 + "px") | |
.style("top", m[1] - 20 + "px") | |
.html(html); | |
} | |
function hideTooltip() { | |
tooltip.style("display", "none"); | |
} | |
function transition(g) { | |
return duration ? g.transition().duration(duration).ease(parsetsEase) : g; | |
} | |
function layout(tree, dimensions, ordinal) { | |
var nodes = [], | |
nd = dimensions.length, | |
y0 = 45, | |
dy = (height - y0 - 2) / (nd - 1); | |
dimensions.forEach(function(d, i) { | |
d.categories.forEach(function(c) { | |
c.dimension = d; | |
c.count = 0; | |
c.nodes = []; | |
}); | |
d.y = y0 + i * dy; | |
}); | |
// Compute per-category counts. | |
var total = (function rollup(d, i) { | |
if (!d.children) return d.count; | |
var dim = dimensions[i], | |
total = 0; | |
dim.categories.forEach(function(c) { | |
var child = d.children[c.name]; | |
if (!child) return; | |
c.nodes.push(child); | |
var count = rollup(child, i + 1); | |
c.count += count; | |
total += count; | |
}); | |
return total; | |
})(tree, 0); | |
// Stack the counts. | |
dimensions.forEach(function(d, i) { | |
d.categories = d.categories.filter(function(d) { return d.count; }); | |
var x = 0, | |
p = spacing / (d.categories.length - 1); | |
d.categories.forEach(function(c) { | |
c.x = x; | |
c.dx = c.count / total * (width - spacing); | |
c.in = {dx: 0}; | |
c.out = {dx: 0}; | |
x += c.dx + p; | |
}); | |
}); | |
var dim = dimensions[0]; | |
dim.categories.forEach(function(c) { | |
var k = c.name; | |
if (tree.children.hasOwnProperty(k)) { | |
recurse(c, {node: tree.children[k], path: k}, 1, ordinal(k)); | |
} | |
}); | |
function recurse(p, d, depth, major) { | |
var node = d.node, | |
dimension = dimensions[depth]; | |
dimension.categories.forEach(function(c) { | |
var k = c.name; | |
if (!node.children.hasOwnProperty(k)) return; | |
var child = node.children[k]; | |
child.path = d.path + "\0" + k; | |
var target = child.target || {node: c, dimension: dimension}; | |
target.x = c.in.dx; | |
target.dx = child.count / total * (width - spacing); | |
c.in.dx += target.dx; | |
var source = child.source || {node: p, dimension: dimensions[depth - 1]}; | |
source.x = p.out.dx; | |
source.dx = target.dx; | |
p.out.dx += source.dx; | |
child.node = child; | |
child.source = source; | |
child.target = target; | |
child.major = major; | |
nodes.push(child); | |
if (depth + 1 < dimensions.length) recurse(c, child, depth + 1, major); | |
}); | |
} | |
return nodes; | |
} | |
// Dynamic path string for transitions. | |
function ribbonPath(d) { | |
var s = d.source, | |
t = d.target; | |
return ribbonPathString(s.node.x0 + s.x0, s.dimension.y0, s.dx, t.node.x0 + t.x0, t.dimension.y0, t.dx, tension0); | |
} | |
// Static path string for mouse handlers. | |
function ribbonPathStatic(d) { | |
var s = d.source, | |
t = d.target; | |
return ribbonPathString(s.node.x + s.x, s.dimension.y, s.dx, t.node.x + t.x, t.dimension.y, t.dx, tension); | |
} | |
function ribbonPathString(sx, sy, sdx, tx, ty, tdx, tension) { | |
var m0, m1; | |
return (tension === 1 ? [ | |
"M", [sx, sy], | |
"L", [tx, ty], | |
"h", tdx, | |
"L", [sx + sdx, sy], | |
"Z"] | |
: ["M", [sx, sy], | |
"C", [sx, m0 = tension * sy + (1 - tension) * ty], " ", | |
[tx, m1 = tension * ty + (1 - tension) * sy], " ", [tx, ty], | |
"h", tdx, | |
"C", [tx + tdx, m1], " ", [sx + sdx, m0], " ", [sx + sdx, sy], | |
"Z"]).join(""); | |
} | |
}; | |
d3.parsets.tree = buildTree; | |
function autoDimensions(d) { | |
return d.length ? d3.keys(d[0]).sort() : []; | |
} | |
function cancelEvent() { | |
d3.event.stopPropagation(); | |
d3.event.preventDefault(); | |
} | |
function dimensionName(d) { return d.name; } | |
function getTotal(dimensions) { | |
return dimensions[0].categories.reduce(function(a, d) { | |
return a + d.count; | |
}, 0); | |
} | |
// Given a text function and width function, truncates the text if necessary to | |
// fit within the given width. | |
function truncateText(text, width) { | |
return function(d, i) { | |
var t = this.textContent = text(d, i), | |
w = width(d, i); | |
if (this.getComputedTextLength() < w) return t; | |
this.textContent = "…" + t; | |
var lo = 0, | |
hi = t.length + 1, | |
x; | |
while (lo < hi) { | |
var mid = lo + hi >> 1; | |
if ((x = this.getSubStringLength(0, mid)) < w) lo = mid + 1; | |
else hi = mid; | |
} | |
return lo > 1 ? t.substr(0, lo - 2) + "…" : ""; | |
}; | |
} | |
var percent = d3.format("%"), | |
ribbonRe = /([^CLMZh, ]+)/g, | |
parsetsEase = "elastic", | |
parsetsId = 0; | |
function ascendingNaN(a, b) { | |
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : a >= a || a <= a ? -1 : b >= b || b <= b ? 1 : NaN; | |
} | |
// Construct tree of all category counts for a given ordered list of | |
// dimensions. Similar to d3.nest, except we also set the parent. | |
function buildTree(root, data, dimensions, value) { | |
zeroCounts(root); | |
var n = data.length, | |
nd = dimensions.length; | |
for (var i = 0; i < n; i++) { | |
var d = data[i], | |
v = value(d, i), | |
node = root; | |
for (var j = 0; j < nd; j++) { | |
var dimension = dimensions[j], | |
category = d[dimension], | |
children = node.children; | |
node.count += v; | |
node = children.hasOwnProperty(category) ? children[category] | |
: children[category] = { | |
children: j === nd - 1 ? null : {}, | |
count: 0, | |
parent: node, | |
name: category | |
}; | |
} | |
node.count += v; | |
} | |
return root; | |
} | |
function zeroCounts(d) { | |
d.count = 0; | |
if (d.children) { | |
for (var k in d.children) zeroCounts(d.children[k]); | |
} | |
} | |
function identity(d) { return d; } | |
})(); |
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
Type | Medium | Browser | Continent | |
---|---|---|---|---|
New Visitor | (none) | Android Browser | Americas | |
New Visitor | (none) | Android Browser | Americas | |
New Visitor | (none) | Android Browser | Americas | |
New Visitor | (none) | Android Browser | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Americas | |
New Visitor | (none) | Chrome | Asia | |
New Visitor | (none) | Chrome | Asia | |
New Visitor | (none) | Chrome | Asia | |
New Visitor | (none) | Chrome | Europe | |
New Visitor | (none) | Chrome | Europe | |
New Visitor | (none) | Chrome | Europe | |
New Visitor | (none) | Chrome | Europe | |
New Visitor | (none) | Chrome | Europe | |
New Visitor | (none) | Firefox | Americas | |
New Visitor | (none) | Firefox | Americas | |
New Visitor | (none) | Firefox | Americas | |
New Visitor | (none) | Firefox | Americas | |
New Visitor | (none) | Firefox | Americas | |
New Visitor | (none) | Firefox | Europe | |
New Visitor | (none) | IE with Chrome Frame | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Americas | |
New Visitor | (none) | Internet Explorer | Asia | |
New Visitor | (none) | Internet Explorer | Asia | |
New Visitor | (none) | Internet Explorer | Asia | |
New Visitor | (none) | Internet Explorer | Asia | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Europe | |
New Visitor | (none) | Internet Explorer | Oceania | |
New Visitor | (none) | Internet Explorer | Oceania | |
New Visitor | (none) | Mozilla Compatible Agent | Americas | |
New Visitor | (none) | Mozilla Compatible Agent | Americas | |
New Visitor | (none) | Mozilla Compatible Agent | Americas | |
New Visitor | (none) | Opera Mini | (not set) | |
New Visitor | (none) | Safari | Americas | |
New Visitor | (none) | Safari | Americas | |
New Visitor | (none) | Safari | Americas | |
New Visitor | (none) | Safari | Asia | |
New Visitor | (none) | Safari | Oceania | |
New Visitor | organic | Android Browser | Americas | |
New Visitor | organic | Android Browser | Americas | |
New Visitor | organic | Android Browser | Asia | |
New Visitor | organic | Android Browser | Oceania | |
New Visitor | organic | Chrome | Africa | |
New Visitor | organic | Chrome | Africa | |
New Visitor | organic | Chrome | Africa | |
New Visitor | organic | Chrome | Africa | |
New Visitor | organic | Chrome | Africa | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Americas | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Asia | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Europe | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Chrome | Oceania | |
New Visitor | organic | Firefox | (not set) | |
New Visitor | organic | Firefox | Africa | |
New Visitor | organic | Firefox | Africa | |
New Visitor | organic | Firefox | Africa | |
New Visitor | organic | Firefox | Africa | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Americas | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Asia | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Europe | |
New Visitor | organic | Firefox | Oceania | |
New Visitor | organic | Firefox | Oceania | |
New Visitor | organic | Firefox | Oceania | |
New Visitor | organic | Firefox | Oceania | |
New Visitor | organic | IE with Chrome Frame | Americas | |
New Visitor | organic | IE with Chrome Frame | Americas | |
New Visitor | organic | IE with Chrome Frame | Americas | |
New Visitor | organic | IE with Chrome Frame | Europe | |
New Visitor | organic | IE with Chrome Frame | Europe | |
New Visitor | organic | Internet Explorer | (not set) | |
New Visitor | organic | Internet Explorer | (not set) | |
New Visitor | organic | Internet Explorer | Africa | |
New Visitor | organic | Internet Explorer | Africa | |
New Visitor | organic | Internet Explorer | Africa | |
New Visitor | organic | Internet Explorer | Africa | |
New Visitor | organic | Internet Explorer | Africa | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Americas | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Asia | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Europe | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Internet Explorer | Oceania | |
New Visitor | organic | Mozilla Compatible Agent | Europe | |
New Visitor | organic | Opera | Americas | |
New Visitor | organic | Opera | Europe | |
New Visitor | organic | RockMelt | Europe | |
New Visitor | organic | Safari | (not set) | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Americas | |
New Visitor | organic | Safari | Asia | |
New Visitor | organic | Safari | Asia | |
New Visitor | organic | Safari | Asia | |
New Visitor | organic | Safari | Asia | |
New Visitor | organic | Safari | Asia | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Europe | |
New Visitor | organic | Safari | Oceania | |
New Visitor | organic | Safari | Oceania | |
New Visitor | organic | Safari | Oceania | |
New Visitor | organic | Safari | Oceania | |
New Visitor | organic | Safari | Oceania | |
New Visitor | organic | Safari | Oceania | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Americas | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Europe | |
New Visitor | referral | Chrome | Oceania | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Americas | |
New Visitor | referral | Firefox | Asia | |
New Visitor | referral | Firefox | Asia | |
New Visitor | referral | Firefox | Asia | |
New Visitor | referral | Firefox | Asia | |
New Visitor | referral | Firefox | Europe | |
New Visitor | referral | Firefox | Europe | |
New Visitor | referral | Firefox | Europe | |
New Visitor | referral | Firefox | Europe | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Americas | |
New Visitor | referral | Internet Explorer | Europe | |
New Visitor | referral | Internet Explorer | Europe | |
New Visitor | referral | Opera | Europe | |
New Visitor | referral | Safari | Europe | |
Returning Visitor | (none) | Chrome | Americas | |
Returning Visitor | (none) | Chrome | Asia | |
Returning Visitor | (none) | Chrome | Asia | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Chrome | Europe | |
Returning Visitor | (none) | Internet Explorer | Americas | |
Returning Visitor | (none) | Internet Explorer | Americas | |
Returning Visitor | (none) | Internet Explorer | Europe | |
Returning Visitor | organic | Android Browser | Europe | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Americas | |
Returning Visitor | organic | Chrome | Asia | |
Returning Visitor | organic | Chrome | Asia | |
Returning Visitor | organic | Chrome | Asia | |
Returning Visitor | organic | Chrome | Europe | |
Returning Visitor | organic | Chrome | Europe | |
Returning Visitor | organic | Firefox | Americas | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Asia | |
Returning Visitor | organic | Firefox | Europe | |
Returning Visitor | organic | Firefox | Europe | |
Returning Visitor | organic | Internet Explorer | (not set) | |
Returning Visitor | organic | Internet Explorer | Africa | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Americas | |
Returning Visitor | organic | Internet Explorer | Europe | |
Returning Visitor | organic | Internet Explorer | Europe | |
Returning Visitor | organic | Internet Explorer | Oceania | |
Returning Visitor | organic | Safari | Americas | |
Returning Visitor | organic | Safari | Europe | |
Returning Visitor | organic | Safari | Europe | |
Returning Visitor | organic | Safari | Europe | |
Returning Visitor | referral | Android Browser | Americas | |
Returning Visitor | referral | Chrome | Americas | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Chrome | Europe | |
Returning Visitor | referral | Firefox | Europe | |
Returning Visitor | referral | Safari | Americas | |
Returning Visitor | referral | Safari | Americas | |
Returning Visitor | referral | Safari | Americas | |
Returning Visitor | referral | Safari | Americas | |
Returning Visitor | referral | Safari | Americas |
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> | |
<meta charset="utf-8"> | |
<title>Web site visitors</title> | |
<style> | |
@import url(d3.parsets.css); | |
body { | |
font-family: sans-serif; | |
font-size: 16px; | |
width: 960px; | |
margin: 1em auto; | |
position: relative; | |
} | |
h1, h2, .dimension text { | |
text-align: center; | |
font-family: "lucida sans","PT Sans", Helvetica; | |
font-weight: 300; | |
} | |
h1 { | |
font-size: 2em; | |
margin: .5em 0 0 0; | |
} | |
h2 { | |
font-size: 2em; | |
margin: 1em 0 0.5em; | |
border-bottom: solid #ccc 1px; | |
} | |
p.meta, p.footer { | |
font-size: 13px; | |
color: #333; | |
} | |
p.meta { | |
text-align: center; | |
} | |
text.icicle { pointer-events: none; } | |
.options { font-size: 12px; text-align: center; padding: 5px 0; } | |
.curves { float: left; } | |
.source { float: right; } | |
pre, code { font-family: "Menlo", monospace; } | |
.html .value, | |
.javascript .string, | |
.javascript .regexp { | |
color: #756bb1; | |
} | |
.html .tag, | |
.css .tag, | |
.javascript .keyword { | |
color: #3182bd; | |
} | |
.comment { | |
color: #636363; | |
} | |
.html .doctype, | |
.javascript .number { | |
color: #31a354; | |
} | |
.html .attribute, | |
.css .attribute, | |
.javascript .class, | |
.javascript .special { | |
color: #e6550d; | |
} | |
</style> | |
<body> | |
<h1>Web Site visitors</h1> | |
<p class="meta">A visualisation technique for multidimensional categorical data. | |
<div id="vis"><noscript></noscript></div> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<script src="d3.parsets.js"></script> | |
<script src="http://www.tips-for-excel.com/d3test/Titanic/highlight.min.js"></script> | |
<script> | |
var chart = d3.parsets() | |
.dimensions(["Continent", "Type", "Medium", "Browser"]); | |
var vis = d3.select("#vis").append("svg") | |
.attr("width", chart.width()) | |
.attr("height", chart.height()); | |
var partition = d3.layout.partition() | |
.sort(null) | |
.size([chart.width(), chart.height() * 5 / 4]) | |
.children(function(d) { return d.children ? d3.values(d.children) : null; }) | |
.value(function(d) { return d.count; }); | |
var ice = false; | |
function curves() { | |
var t = vis.transition().duration(500); | |
if (ice) { | |
t.delay(1000); | |
icicle(); | |
} | |
t.call(chart.tension(this.checked ? .5 : 1)); | |
} | |
d3.csv("data.csv", function(csv) { | |
vis.datum(csv).call(chart); | |
window.icicle = function() { | |
var newIce = this.checked, | |
tension = chart.tension(); | |
if (newIce === ice) return; | |
if (ice = newIce) { | |
var dimensions = []; | |
vis.selectAll("g.dimension") | |
.each(function(d) { dimensions.push(d); }); | |
dimensions.sort(function(a, b) { return a.y - b.y; }); | |
var root = d3.parsets.tree({children: {}}, csv, dimensions.map(function(d) { return d.name; }), function() { return 1; }), | |
nodes = partition(root), | |
nodesByPath = {}; | |
nodes.forEach(function(d) { | |
var path = d.data.name, | |
p = d; | |
while ((p = p.parent) && p.data.name) { | |
path = p.data.name + "\0" + path; | |
} | |
if (path) nodesByPath[path] = d; | |
}); | |
var data = []; | |
vis.on("mousedown.icicle", stopClick, true) | |
.select(".ribbon").selectAll("path") | |
.each(function(d) { | |
var node = nodesByPath[d.path], | |
s = d.source, | |
t = d.target; | |
s.node.x0 = t.node.x0 = 0; | |
s.x0 = t.x0 = node.x; | |
s.dx0 = s.dx; | |
t.dx0 = t.dx; | |
s.dx = t.dx = node.dx; | |
data.push(d); | |
}); | |
iceTransition(vis.selectAll("path")) | |
.attr("d", function(d) { | |
var s = d.source, | |
t = d.target; | |
return ribbonPath(s, t, tension); | |
}) | |
.style("stroke-opacity", 1); | |
iceTransition(vis.selectAll("text.icicle") | |
.data(data) | |
.enter().append("text") | |
.attr("class", "icicle") | |
.attr("text-anchor", "middle") | |
.attr("dy", ".3em") | |
.attr("transform", function(d) { | |
return "translate(" + [d.source.x0 + d.source.dx / 2, d.source.dimension.y0 + d.target.dimension.y0 >> 1] + ")rotate(90)"; | |
}) | |
.text(function(d) { return d.source.dx > 15 ? d.node.name : null; }) | |
.style("opacity", 1e-6)) | |
.style("opacity", 1); | |
iceTransition(vis.selectAll("g.dimension rect, g.category") | |
.style("opacity", 1)) | |
.style("opacity", 1e-6) | |
.each("end", function() { d3.select(this).attr("visibility", "hidden"); }); | |
iceTransition(vis.selectAll("text.dimension")) | |
.attr("transform", "translate(0,-5)"); | |
vis.selectAll("tspan.sort").style("visibility", "hidden"); | |
} else { | |
vis.on("mousedown.icicle", null) | |
.select(".ribbon").selectAll("path") | |
.each(function(d) { | |
var s = d.source, | |
t = d.target; | |
s.node.x0 = s.node.x; | |
s.x0 = s.x; | |
s.dx = s.dx0; | |
t.node.x0 = t.node.x; | |
t.x0 = t.x; | |
t.dx = t.dx0; | |
}); | |
iceTransition(vis.selectAll("path")) | |
.attr("d", function(d) { | |
var s = d.source, | |
t = d.target; | |
return ribbonPath(s, t, tension); | |
}) | |
.style("stroke-opacity", null); | |
iceTransition(vis.selectAll("text.icicle")) | |
.style("opacity", 1e-6).remove(); | |
iceTransition(vis.selectAll("g.dimension rect, g.category") | |
.attr("visibility", null) | |
.style("opacity", 1e-6)) | |
.style("opacity", 1); | |
iceTransition(vis.selectAll("text.dimension")) | |
.attr("transform", "translate(0,-25)"); | |
vis.selectAll("tspan.sort").style("visibility", null); | |
} | |
}; | |
d3.select("#icicle") | |
.on("change", icicle) | |
.each(icicle); | |
}); | |
function iceTransition(g) { | |
return g.transition().duration(1000); | |
} | |
function ribbonPath(s, t, tension) { | |
var sx = s.node.x0 + s.x0, | |
tx = t.node.x0 + t.x0, | |
sy = s.dimension.y0, | |
ty = t.dimension.y0; | |
return (tension === 1 ? [ | |
"M", [sx, sy], | |
"L", [tx, ty], | |
"h", t.dx, | |
"L", [sx + s.dx, sy], | |
"Z"] | |
: ["M", [sx, sy], | |
"C", [sx, m0 = tension * sy + (1 - tension) * ty], " ", | |
[tx, m1 = tension * ty + (1 - tension) * sy], " ", [tx, ty], | |
"h", t.dx, | |
"C", [tx + t.dx, m1], " ", [sx + s.dx, m0], " ", [sx + s.dx, sy], | |
"Z"]).join(""); | |
} | |
function stopClick() { d3.event.stopPropagation(); } | |
// Given a text function and width function, truncates the text if necessary to | |
// fit within the given width. | |
function truncateText(text, width) { | |
return function(d, i) { | |
var t = this.textContent = text(d, i), | |
w = width(d, i); | |
if (this.getComputedTextLength() < w) return t; | |
this.textContent = "…" + t; | |
var lo = 0, | |
hi = t.length + 1, | |
x; | |
while (lo < hi) { | |
var mid = lo + hi >> 1; | |
if ((x = this.getSubStringLength(0, mid)) < w) lo = mid + 1; | |
else hi = mid; | |
} | |
return lo > 1 ? t.substr(0, lo - 2) + "…" : ""; | |
}; | |
} | |
d3.select("#file").on("change", function() { | |
var file = this.files[0], | |
reader = new FileReader; | |
reader.onloadend = function() { | |
var csv = d3.csv.parse(reader.result); | |
vis.datum(csv).call(chart | |
.value(csv[0].hasOwnProperty("Number") ? function(d) { return +d.Number; } : 1) | |
.dimensions(function(d) { return d3.keys(d[0]).filter(function(d) { return d !== "Number"; }).sort(); })); | |
}; | |
reader.readAsText(file); | |
}); | |
</script> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment