Built with blockbuilder.org
forked from SpaceActuary's block: Statistical Summaries
Built with blockbuilder.org
forked from SpaceActuary's block: Statistical Summaries
| count | min | p25 | median | p75 | max | mean | |
|---|---|---|---|---|---|---|---|
| 20 | -1.5962268562822681 | -0.27496873806393995 | 0.590106005243372 | 1.6372920342677557 | 3.707343003109737 | 0.7166006482224265 | |
| 66 | -1.5851205060435567 | -0.33785073255720427 | 0.023084836830005662 | 0.34559110995355913 | 1.4257981370845658 | -0.012238454195877406 | |
| 52 | -5.203138771345231 | -1.966842666609654 | -0.11819865259216729 | 1.8101197428151161 | 4.5227710879501934 | -0.2742241463649254 |
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/jstat/1.5.0/jstat.min.js"></script> | |
| <style> | |
| body { | |
| margin:0; | |
| position:fixed; | |
| top:0;right:0;bottom:0;left:0; | |
| font-size: 14px; | |
| font-family: sans-serif; | |
| } | |
| svg { margin: 0px; } | |
| table { | |
| margin: 20px; | |
| border-collapse: collapse; | |
| } | |
| table, th, td { | |
| border: 1px solid black; | |
| padding: 5px; | |
| } | |
| rect { fill: steelblue; } | |
| line { stroke: #222; stroke-width: 1px; } | |
| circle { fill: #222; } | |
| rect.outline { | |
| stroke: #000000; | |
| stroke-width: 1px; | |
| fill: none; | |
| } | |
| text.count { | |
| fill: #000; | |
| text-anchor: end; | |
| } | |
| text { | |
| dominant-baseline: central; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <script> | |
| console.clear() | |
| var margin = {top: 20, bottom: 20, left: 20, right: 20}, | |
| height = 500 - margin.top - margin.bottom, // default height | |
| width = 900 - margin.left - margin.right; // default width | |
| var svg = d3.select("body").append("svg") | |
| .attr("width", width + margin.left + margin.right) | |
| .attr("height", height + margin.top + margin.bottom) | |
| .append("g") | |
| .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
| d3.csv("data.csv", function(mydata){ | |
| mydata.forEach(function(d){ | |
| d.count = +d.count; | |
| d.min = +d.min; | |
| d.p25 = +d.p25; | |
| d.median = +d.median; | |
| d.p75 = +d.p75; | |
| d.max = +d.max; | |
| d.mean = +d.mean; | |
| }) | |
| //console.table(mydata); | |
| var maxCount = d3.max(mydata, function(d){ return d.count; }), | |
| minmin = d3.min(mydata, function(d){ return d.min; }), | |
| maxmax = d3.max(mydata, function(d){ return d.max; }) | |
| var rows = svg.selectAll("g.row").data(mydata); | |
| var myParamLevelSummary = ParamLevelSummary() | |
| .countDomain([0, maxCount]) | |
| .paramDomain([minmin, maxmax]) | |
| .countValue(function(d){ return d.count; }) | |
| var rowsEnter = rows.enter().append("g") | |
| .attr("class", "row") | |
| rows.call(myParamLevelSummary) | |
| }); | |
| function ParamLevelSummary() { | |
| var height = 50, // default height | |
| levelWidth = 100, | |
| countWidth = 100, | |
| paramWidth = 400, | |
| width = countWidth + paramWidth + 200, | |
| countFormat = d3.format(",.0f"), | |
| paramFormat = d3.format(".3f"), | |
| levelValue = function(d, i){ return i; }, | |
| countValue = function(d, i){ return i; }, | |
| paramValue = function(d, i){ return i; }, | |
| countScale = d3.scale.linear().range([0, 1]), | |
| paramScale = d3.scale.linear(), | |
| line = d3.svg.line() | |
| .x(function(d, i, data){ return xScale(d.x); }) | |
| .y(function(d, i, data){ return yScale(d.y); }); | |
| function chart(selection) { | |
| selection.each(function(data, i){ | |
| var chartData = data; | |
| console.log(i); | |
| console.table([chartData]); | |
| var yExt = d3.extent(chartData, function(d){ return d.y; }); | |
| countScale | |
| .range([0, countWidth]); | |
| paramScale | |
| .range([0, paramWidth]); | |
| var gRow = d3.select(this).selectAll("g.main").data([chartData]) | |
| var gRowEnter = gRow.enter().append("g").attr("class", "main") | |
| gRowEnter.append("rect").attr("class", "outline") | |
| gRowEnter.append("text").attr("class", "level") | |
| gRowEnter.append("text").attr("class", "count") | |
| gRowEnter.append("rect").attr("class", "count") | |
| var gParamEnter = gRowEnter.append("g").attr("class", "param") | |
| var boxPlot = MinimalBoxPlot() | |
| .width(paramWidth) | |
| .height(height) | |
| .xValue(paramValue) | |
| .xDomain(paramScale.domain()) | |
| .xFormat(paramFormat) | |
| var gParam = gRow.selectAll("g.param") | |
| .attr("transform", "translate(" + (levelWidth+countWidth+40) + ",0)") | |
| .call(boxPlot) | |
| gRow.attr("transform", "translate(" + 0 + "," + (i * (height + 5)) + ")") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var outline = gRow.selectAll("rect.outline") | |
| .attr("width", width ) | |
| .attr("height", height); | |
| var countText = gRow.selectAll("text.level") | |
| .text(levelValue(data, i)) | |
| .attr("transform", "translate(" + 10 + "," + (height / 2) + ")"); | |
| var countText = gRow.selectAll("text.count") | |
| .text(countValue(data, i)) | |
| .attr("transform", "translate(" + (levelWidth+20) + "," + (height/2) + ")"); | |
| var countRect = gRow.selectAll("rect.count") | |
| .attr("transform", "translate(" + (levelWidth+30) + "," + (height/4) + ")") | |
| .attr("height", height / 2) | |
| .attr("width", countScale(countValue(data))); | |
| }); | |
| } | |
| chart.width = function(_) { | |
| if (!arguments.length) return width; | |
| width = _; | |
| return chart; | |
| }; | |
| chart.height = function(_) { | |
| if (!arguments.length) return height; | |
| height = _; | |
| return chart; | |
| }; | |
| chart.countValue = function(_) { | |
| if (!arguments.length) return countValue; | |
| countValue = _; | |
| return chart; | |
| }; | |
| chart.paramValue = function(_) { | |
| if (!arguments.length) return paramValue; | |
| paramValue = _; | |
| return chart; | |
| }; | |
| chart.countFormat = function(_) { | |
| if (!arguments.length) return countFormat; | |
| countFormat = _; | |
| return chart; | |
| }; | |
| chart.paramFormat = function(_) { | |
| if (!arguments.length) return paramFormat; | |
| paramFormat = _; | |
| return chart; | |
| }; | |
| chart.countDomain = function(_) { | |
| if (!arguments.length) return countScale.domain; | |
| countScale.domain(_); | |
| return chart; | |
| }; | |
| chart.paramDomain = function(_) { | |
| if (!arguments.length) return paramScale.domain; | |
| paramScale.domain(_); | |
| return chart; | |
| }; | |
| return chart; | |
| } | |
| function MinimalBoxPlot() { | |
| var height = 50, // default height | |
| width = 400, | |
| xFormat = d3.format(".3f"), | |
| xValue = function(d, i){ return i; }, | |
| xScale = d3.scale.linear(); | |
| function chart(selection) { | |
| selection.each(function(data, i){ | |
| var chartData = data; | |
| console.log(i); | |
| console.table([chartData]); | |
| var yExt = d3.extent(chartData, function(d){ return d.y; }); | |
| xScale.range([0, width]); | |
| var gElement = d3.select(this).selectAll("g.miniboxplot").data([chartData]) | |
| var gElementEnter = gElement.enter().append("g").attr("class", "miniboxplot") | |
| gElementEnter.append("line").attr("class", "range") | |
| gElementEnter.append("line").attr("class", "p25") | |
| gElementEnter.append("line").attr("class", "p50") | |
| gElementEnter.append("line").attr("class", "p75") | |
| gElementEnter.append("circle").attr("class", "mean") | |
| gElement.attr("transform", "translate(" + (0) + ",0)") | |
| // range | |
| var range = gElement.selectAll("line.range") | |
| .attr("x1", function(d){ return xScale(d.min); }) | |
| .attr("x2", function(d){ return xScale(d.max); }) | |
| .attr("y1", height / 2) | |
| .attr("y2", height / 2) | |
| // 25th percentile | |
| var p25 = gElement.selectAll("line.p25") | |
| .attr("x1", function(d){ return xScale(d.p25); }) | |
| .attr("x2", function(d){ return xScale(d.p25); }) | |
| .attr("y1", 6) | |
| .attr("y2", height - 6) | |
| // median | |
| var p50 = gElement.selectAll("line.p50") | |
| .attr("x1", function(d){ return xScale(d.median); }) | |
| .attr("x2", function(d){ return xScale(d.median); }) | |
| .attr("y1", 2) | |
| .attr("y2", height - 2) | |
| // 75th percentile | |
| var p75 = gElement.selectAll("line.p75") | |
| .attr("x1", function(d){ return xScale(d.p75); }) | |
| .attr("x2", function(d){ return xScale(d.p75); }) | |
| .attr("y1", 6) | |
| .attr("y2", height - 6) | |
| // mean | |
| var mean = gElement.selectAll("circle.mean") | |
| .attr("cy", height / 2) | |
| .attr("cx", function(d){ return xScale(d.mean); }) | |
| .attr("r", 5) | |
| }); | |
| } | |
| chart.width = function(_) { | |
| if (!arguments.length) return width; | |
| width = _; | |
| return chart; | |
| }; | |
| chart.height = function(_) { | |
| if (!arguments.length) return height; | |
| height = _; | |
| return chart; | |
| }; | |
| chart.xValue = function(_) { | |
| if (!arguments.length) return xValue; | |
| xValue = _; | |
| return chart; | |
| }; | |
| chart.xFormat = function(_) { | |
| if (!arguments.length) return xFormat; | |
| xFormat = _; | |
| return chart; | |
| }; | |
| chart.xDomain = function(_) { | |
| if (!arguments.length) return xScale.domain; | |
| xScale.domain(_); | |
| return chart; | |
| }; | |
| return chart; | |
| } | |
| d3.csv("data.csv", function(mydata){ | |
| mydata.forEach(function(d){ | |
| d.count = +d.count; | |
| d.min = +d.min; | |
| d.p25 = +d.p25; | |
| d.median = +d.median; | |
| d.p75 = +d.p75; | |
| d.max = +d.max; | |
| d.mean = +d.mean; | |
| }) | |
| console.table(mydata); | |
| var maxCount = d3.max(mydata, function(d){ return d.count; }), | |
| minmin = d3.min(mydata, function(d){ return d.min; }), | |
| maxmax = d3.max(mydata, function(d){ return d.max; }) | |
| /* | |
| thead.selectAll("th").data(["Group", "Count", "Range"]) | |
| .enter().append("th") | |
| .html(function(d){ return d; }) | |
| var tr = tbody.selectAll("tr").data(mydata); | |
| var trEnter = tr.enter().append("tr") | |
| trEnter.append("td").html(function(d, i){ return i; }) | |
| var countSVG = trEnter.append("td").html(function(d, i){ return d.count; }) | |
| .append("svg") | |
| .attr("height", rowHeight) | |
| .attr("width", barWidth) | |
| countSVG.append("rect") | |
| .attr("height", rowHeight) | |
| .attr("width", function(d){ return d3.round(d.count / maxCount * barWidth); }) | |
| var rangeSVG = trEnter.append("td").append("svg") | |
| .attr("height", rowHeight) | |
| .attr("width", rangeWidth) | |
| var rangeScale = d3.scale.linear() | |
| .domain([minmin, maxmax]) | |
| .range([0, rangeWidth]); | |
| // reference | |
| rangeSVG.append("line") | |
| .attr("x1", function(d){ return rangeScale(0); }) | |
| .attr("x2", function(d){ return rangeScale(0); }) | |
| .attr("y1", 0) | |
| .attr("y2", rowHeight) | |
| .attr("stroke-dasharray", "2 2 2 2") | |
| */ | |
| }); | |
| function data(n){ | |
| var samples = d3.range(0, n).map(function(){ | |
| var mean = Math.random() - 0.5, | |
| sd = Math.random() * 3, | |
| x = Math.floor(Math.random() * 60) + 20, | |
| myrand = d3.random.normal(mean, sd); | |
| return d3.range(0, x).map(function(){ return myrand(); }); | |
| }); | |
| return samples.map(function(d){ | |
| d = d.sort(d3.ascending) | |
| return [ | |
| d.length, | |
| d3.quantile(d, 0), | |
| d3.quantile(d, 0.25), | |
| d3.quantile(d, 0.5), | |
| d3.quantile(d, 0.75), | |
| d3.quantile(d, 1), | |
| d3.mean(d) | |
| ] | |
| }) | |
| } | |
| </script> | |
| </body> |