// Generated by CoffeeScript 1.10.0 (function() { var SIZE, compare_obj, height, matrix, redraw, sort_object_keys, svg, width, zoom, zoomable_layer, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; svg = d3.select('svg'); width = svg.node().getBoundingClientRect().width; height = svg.node().getBoundingClientRect().height; zoomable_layer = svg.append('g'); zoom = d3.behavior.zoom().scaleExtent([0.3, 4]).on('zoom', function() { return zoomable_layer.attr({ transform: "translate(" + (zoom.translate()) + ")scale(" + (zoom.scale()) + ")" }); }); svg.call(zoom); matrix = zoomable_layer.append('g').attr('transform', 'translate(125,170)scale(0.4)'); SIZE = 13; compare_obj = function(a, b) { if (a.amount > b.amount) { return -1; } if (a.amount < b.amount) { return 1; } return 0; }; sort_object_keys = function(obj) { var k, keys, v; keys = []; for (k in obj) { v = obj[k]; keys.push({ key: k, amount: v }); } return keys.sort(compare_obj); }; redraw = function(filename) { return d3.json(filename, function(data) { var cells, clusters, column_mouseout, column_mouseover, columns, enter_cells, enter_columns, enter_hlabels, enter_vlabels, hlabels, items, matrix_data, predicates_data, tree, vlabels; items = []; predicates_data = {}; data.forEach(function(e1) { var vector; vector = []; e1.predicates.forEach(function(e2) { var ref; vector.push(e2.value); if (ref = e2.p, indexOf.call(Object.keys(predicates_data), ref) < 0) { predicates_data[e2.p] = 0; } return predicates_data[e2.p] += e2.value; }); return items.push({ instance: e1.i, vector: vector }); }); clusters = clusterfck.hcluster(items, (function(a, b) { var i, l, ref, total; total = 0; for (i = l = 0, ref = a.vector.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { total += Math.pow(b.vector[i] - a.vector[i], 2); } return Math.sqrt(total); }), clusterfck.SINGLE_LINKAGE); tree = tree_utils.binary_to_std(clusters); tree_utils.recursive_sort(tree, function(a, b) { return b.key - a.key; }, function(n) { if (n.children != null) { return n.key = d3.min(n.children, function(c) { return c.key; }); } else { return n.key = n.value.vector.reduce(function(t, s) { return t + s; }); } }); matrix_data = tree_utils.get_leaves(tree).map(function(d) { return d.value; }); matrix_data = matrix_data.map(function(d, i) { var obj, v; obj = {}; obj.key = d.instance; v = d.vector.map(function(value, j) { var o; o = {}; o.value = value; o.key = Object.keys(predicates_data)[j]; o.amount = predicates_data[Object.keys(predicates_data)[j]]; o.parent = obj; return o; }); v.sort(compare_obj); obj.values = v; return obj; }); column_mouseover = function() { return d3.select(this).style({ opacity: 0.6 }); }; column_mouseout = function() { return d3.select(this).style({ opacity: 1 }); }; columns = matrix.selectAll('.column').data(matrix_data, function(instance) { return filename + "_" + instance.key; }); enter_columns = columns.enter().append('g').attr('class', 'column').attr('transform', function(d, i) { return "translate(" + (SIZE * i) + ",0)"; }).on('mouseover', column_mouseover).on('mouseout', column_mouseout); columns.exit().remove(); cells = columns.selectAll('.cell').data(function(column) { return column.values; }); enter_cells = cells.enter().append('rect').attr('class', 'cell'); enter_cells.attr('width', SIZE).attr('height', SIZE).attr('transform', function(d, i) { return "translate(0," + (SIZE * i) + ")"; }).attr('fill', function(d) { if (d.value === 0) { return '#e0e0e0'; } else { return '#1a1a1a'; } }).append('title').text(function(d) { return d.key + "\n" + d.parent.key; }); cells.exit().remove(); hlabels = matrix.selectAll('.hlabel').data(sort_object_keys(predicates_data).map(function(instance) { return instance.key; }), (function(instance) { return filename + "_" + instance; })); enter_hlabels = hlabels.enter().append('a').attr('class', 'hlabel').attr('xlink:href', function(d) { return d; }); enter_hlabels.append('text').text(function(d) { return d; }).attr('dy', '1em').attr('dx', -6); hlabels.select('text').attr('transform', function(d, i) { return "translate(0," + (SIZE * i) + ")"; }); hlabels.exit().remove(); vlabels = matrix.selectAll('.vlabel').data(matrix_data.map(function(instance) { return instance.key; }), (function(instance) { return filename + "_" + instance; })); enter_vlabels = vlabels.enter().append('a').attr('class', 'vlabel').attr('xlink:href', function(d) { return d; }); enter_vlabels.append('text').text(function(d) { return d.replace('http://dbpedia.org/resource/', ''); }).attr('dy', '1em').attr('dx', 6); vlabels.select('text').attr('transform', function(d, i) { return "translate(" + (SIZE * i) + ",0) rotate(-90)"; }); return vlabels.exit().remove(); }); }; d3.select('select').on('change', function() { return redraw(this.value); }); redraw('guitarist.json'); }).call(this);