Built with blockbuilder.org
forked from evbettor's block: Sustained Allegations by Ward
| license: mit |
Built with blockbuilder.org
forked from evbettor's block: Sustained Allegations by Ward
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <style> | |
| rect { | |
| stroke: #000; | |
| } | |
| body { | |
| background: #000; | |
| } | |
| text { | |
| font-family: sans-serif; | |
| fill: #fff; | |
| } | |
| .tooltip { | |
| background-color: #f7f7f7; | |
| padding: 3px 12px; | |
| font-family: sans-serif; | |
| border: 1px solid #bbbbbb; | |
| box-shadow: 1px 1px 4px #bbbbbb; | |
| } | |
| .tooltip_title { | |
| font-weight: bold; | |
| font-size: 14px; | |
| margin: 5px 0; | |
| max-width: 300px; | |
| word-wrap: normal; | |
| } | |
| .tooltip_body { | |
| font-weight: normal; | |
| margin: 5px 0; | |
| } | |
| .tooltip_img { | |
| max-width: 240px; | |
| } | |
| </style> | |
| <title>Ward Officers Complaint Follow-Up</title> | |
| <svg width="1700" height="900"></svg> | |
| <script src="https://d3js.org/d3.v4.js"></script> | |
| <script> | |
| var root; | |
| var width = 1700 | |
| var height = 900; | |
| var svg = d3.select("svg"); | |
| var format = d3.format(",d"); | |
| var color = d3.scaleOrdinal() | |
| .range(d3.schemeCategory10 | |
| .map(function(c) { c = d3.rgb(c); c.opacity = 0.6; return c; })); | |
| var color2 = d3.scaleLinear() | |
| .range(["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"]) | |
| .domain([ 1, .25, .2,.12, .10, .08,.06, .04, .02,.01,0]); | |
| var nest = d3.nest() | |
| .key(function(d) { return d["Ward"]; }); | |
| var tooltip = d3.select("body") | |
| .append("div") | |
| .attr("class", "tooltip") | |
| .style("position", "absolute") | |
| .style("z-index", "10") | |
| .style("visibility", "hidden"); | |
| var treemap = d3.treemap() | |
| .size([width, height]) | |
| .tile(d3.treemapBinary) | |
| .paddingOuter(4) | |
| .paddingTop(15) | |
| .paddingInner(1) | |
| .round(true); | |
| // load data | |
| var url = 'https://raw.githubusercontent.com/evbettor/ii_treemap/master/all_all_sum.csv'; | |
| d3.csv(url, function(error, data) { | |
| if (error) throw error; | |
| // coerce numbers | |
| ["n", "sd_plus"].forEach(function(col) { | |
| data.forEach(function(d) { | |
| d[col] = +d[col]; | |
| }); | |
| }); | |
| var subset = data.filter(function(d) { | |
| return d["Ward"] !== "NA"; | |
| }); | |
| var nested = nest.entries(subset); | |
| console.log(nested); | |
| root = d3.hierarchy({ | |
| name: "root", | |
| values: nested | |
| }, function(d) { | |
| return d.values; | |
| }) | |
| .sum(function(d) { | |
| return d.n; | |
| }); | |
| treemap(root); | |
| var cell = svg | |
| .selectAll(".node") | |
| .data(root.descendants()) | |
| .enter().append("g") | |
| .attr("transform", function(d) { return "translate(" + d.x0 + "," + d.y0 + ")"; }) | |
| .attr("class", function(d,i) { return "node depth-" + d.depth; }) | |
| .each(function(d) { d.node = this; }) | |
| //function to format to percentages | |
| var format = d3.format(".1%"); | |
| format(0.005); // 0.5% | |
| cell.append("rect") | |
| .attr("id", function(d,i) { return "rect-" + i; }) | |
| .attr("width", function(d) { return d.x1 - d.x0; }) | |
| .attr("height", function(d) { return d.y1 - d.y0; }) | |
| .attr("fill", function(d) { | |
| return d.depth == 2 ? color2(d.data["sd_plus"]) : "transparent"; | |
| }) | |
| .on("mouseover", function(d) { | |
| tooltip.html(""); | |
| tooltip.append("h3").attr("class", "tooltip_title"); | |
| tooltip.append("img").attr("class", "tooltip_img"); | |
| tooltip.append("pre").attr("class", "tooltip_body"); | |
| tooltip.select(".tooltip_title") | |
| .text(d.data.category) | |
| tooltip.select(".tooltip_body") | |
| .text( | |
| "Number of Cases: " + d.data.n + "\n" + | |
| "% of Sustained: " + format(d.data.sd_plus) + "\n" | |
| ); | |
| return tooltip.style("visibility", "visible"); | |
| }) | |
| .on("mousemove", function() { | |
| return tooltip.style("top", (d3.event.pageY-52) + "px").style("left", (d3.event.pageX+18) + "px"); | |
| }) | |
| .on("mouseout", function() { | |
| return tooltip.style("visibility", "hidden"); | |
| }); | |
| //for the hover effect that highlights | |
| /* | |
| .on("mouseover", function(d) { | |
| console.log(d.data.full_name); | |
| console.log("tot_minutes", d.data.tot_minutes); | |
| console.log("plus_minus", d.data["plus_minus"]); | |
| d3.selectAll("rect") | |
| .style("opacity", 0.2); | |
| d3.select(this) | |
| .style("opacity", 1); | |
| }) | |
| .on("mouseout", function(d) { | |
| d3.selectAll("rect") | |
| .style("opacity", 1); | |
| }); | |
| */ | |
| cell.append("clipPath") | |
| .attr("id", function(d,i) { return "clip-" + i; }) | |
| .append("use") | |
| .attr("xlink:href", function(d,i) { return "#rect-" + i; }); | |
| var label = cell.append("text") | |
| .attr("clip-path", function(d,i) { return "url(#clip-" + i + ")"; }); | |
| label | |
| .selectAll("tspan") | |
| .data(function(d) { return [d.data]; }) | |
| .enter().append("tspan") | |
| .attr("x", function(d, i) { return i ? null : 2; }) | |
| .attr("y", 12) | |
| .text(function(d) { | |
| return d.key; | |
| }); | |
| //title | |
| svg.append("text") | |
| .attr("x", 0) | |
| .attr("y", 0 - (margin.top / 2)) | |
| .attr("text-anchor", "middle") | |
| .style('fill', 'white') | |
| .style("font-size", "16px") | |
| .attr("font-family", "sans-serif") | |
| //.style("text-decoration", "underline") | |
| .text("Ward by complaint"); | |
| }); | |
| </script> |