Last active
August 29, 2015 14:11
-
-
Save avimoondra/f0572ab7d097c46b383d to your computer and use it in GitHub Desktop.
Modality
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> | |
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> | |
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<meta name="viewport" content="width=device-width, initial-scale=1"> | |
<meta charset="utf-8"> | |
</head> | |
<body> | |
<style> | |
#panelWrapper { | |
width: 180px; | |
border: solid #808080 1px; | |
padding: 10px; | |
display: inline-block; | |
position: fixed; | |
margin-top: 10px; | |
} | |
.chartWrapper{ | |
display: inline-block; | |
} | |
.separator { | |
margin-bottom: 10px; | |
height: 1px; | |
background-color: #808080; | |
} | |
.buttonRow{ | |
width: 50%; | |
margin: 0 auto; | |
} | |
.chart .bar rect{ | |
fill: #569BBD; | |
} | |
.chart { | |
font: 10px sans-serif; | |
} | |
.axis path, .axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
</style> | |
<div> | |
<div id="uniModal" class="chartWrapper"> | |
<div class="svgWrapper"></div> | |
<div class="buttonRow"> | |
<button type="button" class="btn btn-sm btn-default dropButton">Drop</button> | |
<button type="button" class="btn btn-sm btn-default resetButton disabled">Reset</button> | |
</div> | |
</div> | |
<div id="biModal" class="chartWrapper"> | |
<div class="svgWrapper"></div> | |
<div class="buttonRow"> | |
<button type="button" class="btn btn-sm btn-default dropButton">Drop</button> | |
<button type="button" class="btn btn-sm btn-default resetButton disabled">Reset</button> | |
</div> | |
</div> | |
<div id="multiModal" class="chartWrapper"> | |
<div class="svgWrapper"></div> | |
<div class="buttonRow"> | |
<button type="button" class="btn btn-sm btn-default dropButton">Drop</button> | |
<button type="button" class="btn btn-sm btn-default resetButton disabled">Reset</button> | |
</div> | |
</div> | |
<div id="panelWrapper"> | |
<div> | |
<p> Histogram Modes</p> | |
<div class="separator"></div> | |
<p> | |
Drop a "limp spaghetti" to see the peaks in the distribution more clearly. From left to right, we observe single modal, bimodal, and multimodal distributions. | |
</p> | |
</div> | |
</div> | |
</div> | |
<script> | |
var margin = {top: 20, right: 30, bottom: 30, left: 30}, | |
width = 220 - margin.left - margin.right, | |
height = 300 - margin.top - margin.bottom; | |
chartData = {}; | |
var drawHistogram = function(chartName, histData, lineData){ | |
var chart = d3.select("#" + chartName + " .svgWrapper").append("svg") | |
.attr("class","chart " + chartName) | |
.attr("width", width + margin.left + margin.right) | |
.attr("height", height + margin.top + margin.bottom) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
var x = d3.scale.linear() | |
.domain([0, d3.max(histData, function(d) { return d; })]) | |
.range([0, width]); | |
var data = d3.layout.histogram() | |
.bins(x.ticks(14)) | |
(histData); | |
var y = d3.scale.linear() | |
.domain([0, d3.max(data, function(d) { return d.y; })]) | |
.range([height, 0]); | |
chartData[chartName] = {}; | |
chartData[chartName]["xScale"] = x; | |
chartData[chartName]["yScale"] = y; | |
var bar = chart.selectAll(".bar") | |
.data(data) | |
.enter().append("g") | |
.attr("class", "bar") | |
.attr("transform", function(d) { return "translate(" + x(d.x) + "," + y(d.y) + ")"; }); | |
bar.append("rect") | |
.attr("x", 1) | |
.attr("width", x(data[0].dx) - 1) | |
.attr("height", function(d) { return height - y(d.y); }); | |
var xAxis = d3.svg.axis() | |
.scale(x) | |
.orient("bottom"); | |
var yAxis = d3.svg.axis() | |
.scale(y) | |
.orient("left"); | |
chart.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + height + ")") | |
.call(xAxis); | |
chart.append("g") | |
.attr("class", "y axis") | |
.call(yAxis) | |
chartData[chartName]["end"] = lineData; | |
startLineData = []; | |
maxY= d3.max(data, function(d) { return d.y; }) - 0.5; | |
console.log(maxY) | |
for(index in lineData){ | |
point = {}; | |
point["x"] = lineData[index].x; | |
point["y"] = maxY | |
startLineData.push(point) | |
} | |
chartData[chartName]["start"] = startLineData; | |
drawNoodle(chartName); | |
} | |
var drawNoodle = function(chartName){ | |
d3.select("path." + chartName).remove(); | |
lineDataStart = chartData[chartName]["start"]; | |
x = chartData[chartName]["xScale"]; | |
y = chartData[chartName]["yScale"]; | |
var lineFunction = d3.svg.line() | |
.x(function(d) { return margin.left + x(d.x); }) | |
.y(function(d) { return y(d.y); }) | |
.interpolate("basis"); | |
var lineGraph = d3.select(".chart." + chartName).append("path") | |
.attr("class",chartName) | |
.attr("d", lineFunction(lineDataStart)) | |
.attr("stroke", "#EDDDA9") | |
.attr("stroke-width", 4) | |
.attr("fill", "none"); | |
} | |
var dropNoodle = function(chartName){ | |
lineDataEnd = chartData[chartName]["end"]; | |
x = chartData[chartName]["xScale"]; | |
y = chartData[chartName]["yScale"]; | |
var lineFunction = d3.svg.line() | |
.x(function(d) { return margin.left + x(d.x); }) | |
.y(function(d) { return y(d.y); }) | |
.interpolate("basis"); | |
var lineGraph = d3.select("path." + chartName) | |
.transition() | |
.attr("d", lineFunction(lineDataEnd)) | |
} | |
d3.json("../static/data/00/modalData.json", function(error, data) { | |
histData = data["histData"]; | |
lineData = data["lineData"]; | |
//console.log(lineData["biModal"]) | |
for (key in histData) { | |
console.log(lineData) | |
drawHistogram(key, histData[key], lineData[key]); | |
} | |
d3.selectAll(".dropButton").on("click", function(){ | |
chartName = $(this).parents(".chartWrapper").attr("id"); | |
dropNoodle(chartName); | |
$(this).siblings('.resetButton').removeClass("disabled"); | |
$(this).addClass("disabled"); | |
}) | |
d3.selectAll(".resetButton").on("click", function(){ | |
chartName = $(this).parents(".chartWrapper").attr("id"); | |
drawNoodle(chartName); | |
$(this).siblings('.dropButton').removeClass("disabled"); | |
$(this).addClass("disabled"); | |
}) | |
}); | |
</script> | |
</body> |
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
{ | |
"histData": | |
{ | |
"uniModal": [7.687, 3.466, 8.545, 4.276, 5.06, 7.471, 11.976, 12.077, 5.479, 2.596, 5.698, 2.751, 3.416, 3.553, 9.785, 8.244, 11.545, 6.138, 5.224, 1.835, 7.78, 3.296, 4.168, 6.979, 2.152, 8.061, 7.118, 9.654, 4.672, 6.08, 4.323, 4.439, 4.888, 4.577, 2.765, 11.493, 2.288, 5.74, 4.682, 14.511, 2.603, 10.481, 3.837, 9.225, 9.544, 9.008, 8.274, 10.491, 3.031, 13.287, 5.501, 11.441, 2.952, 4.251, 3.366, 9.531, 2.248, 12.383, 4.716, 3.876, 1.639, 13.624, 16.278, 1.753, 8.088], | |
"biModal": [9.779, 2.461, 10.855, 4.906, 2.082, 0.495, 3.293, 1.568, 2.647, 7.333, 5.342, 2.883, 10.975, 4.485, 8.248, 2.428, 3.01, 4.164, 2.766, 7.803, 4.808, 2.33, 16.393, 15.934, 18.849, 16.281, 18.958, 12.436, 18.053, 18.675, 15.581, 18.794, 16.933, 17.704, 16.778, 16.393, 14.54, 17.395, 18.318, 15.325, 15.979, 15.663, 16.466, 17.671, 14.677, 17.716, 17.448, 16.734, 16.359, 19.392, 14.851, 16.476, 18.292, 14.943, 16.913, 13.929, 16.955, 14.653, 17.638, 18.759, 17.587, 17.228], | |
"multiModal": [4.819, 0.958, 0.943, 0.182, 0.744, 0.713, 2.01, 3.294, 6.932, 2.861, 1.183, 0.779, 2.086, 5.449, 3.172, 6.462, 1.85, 1.006, 4.223, 3.125, 13.621, 11.475, 11.985, 11.605, 10.955, 11.159, 9.329, 9.863, 11.329, 11.668, 13.277, 11.802, 11.843, 10.789, 10.492, 12.178, 11.834, 12.349, 12.47, 12.629, 11.176, 11.253, 10.147, 12.209, 9.839, 11.742, 10.552, 12.266, 10.026, 12.55, 10.459, 13.111, 10.789, 13.371, 11.531, 21.031, 18.297, 18.276, 17.479, 19.921, 20.064, 17.854, 18.255, 16.268, 18.391, 17.369, 15.905, 17.091, 20.028, 17.454, 18.063, 16.417, 18.824, 16.649, 16.737, 17.569, 18.151, 18.381, 17.822, 21.437, 17.06, 17.929, 19.995, 17.221, 17.995, 20.171, 18.677, 16.582, 17.458, 17.743, 18.357, 18.878, 19.189, 18.19, 19.956, 21.355, 19.451] | |
}, | |
"lineData": | |
{ | |
"uniModal": [ | |
{ "x": 0, "y": 3.5}, | |
{ "x": 4, "y": 12.25}, | |
{ "x": 10, "y": 5.0}, | |
{ "x": 17, "y": 0.25}], | |
"biModal": [ | |
{ "x": 0, "y": 3.5}, | |
{ "x": 3, "y": 11}, | |
{ "x": 6, "y": 4}, | |
{ "x": 12, "y": 2}, | |
{ "x": 16, "y": 32}, | |
{ "x": 19, "y": 25}], | |
"multiModal": [ | |
{ "x": 0, "y": 8}, | |
{ "x": 1.5, "y": 11}, | |
{ "x": 6, "y": 1}, | |
{ "x": 8, "y": 3}, | |
{ "x": 10, "y": 30}, | |
{ "x": 14.5, "y": 10}, | |
{ "x": 17.5, "y": 22.5}, | |
{ "x": 19.5, "y": 24}, | |
{ "x": 21, "y": 20}] | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment