<script type="text/javascript" src="colorbrewer.js"></script>
<script type="text/javascript" src="d3.min.js" charset="utf-8"></script>
<script type="text/javascript" src="lodash.min.js"></script>
<script type="text/javascript" src="moment.min.js"></script>
<link rel="stylesheet" href="bootstrap.min.css">
<title>Big Data: How big is too big?</title>
<form class="form-inline">
<label for="numDataPoints">Number of data points:</label>
<input type="text" class="form-control" id="numDataPoints" placeholder="5000" onfocus="clearCircles()" />
<label for="#slowCheckboxGen">Slow?</label>
<input id="slowCheckboxGen" type="checkbox" />
<button type="button" class="btn btn-default" onclick="generateAndDrawData()">Generate & Draw</button>
<form class="form-inline">
<button type="button" class="btn btn-default" onclick="invertData()">Invert</button>
<button id="splitButton" type="button" class="btn btn-default" onclick="splitOrUnsplitData()">Split</button>
<label for="#slowCheckboxShift">Slow?</label>
<input id="slowCheckboxShift" type="checkbox" />
<button id="shiftButton" type="button" class="btn btn-default" onclick="shiftOrUnshiftData()">Shift</button>
<div class="well well-small">
Generated data in <span id="dataGenSpan"></span> milliseconds
<div class="well well-small">
Drew data in <span id="dataDrawSpan"></span> milliseconds
<div id="shiftReport" class="well well-small hidden">
Shifted data in <span id="dataShiftSpan"></span> milliseconds
<script type="text/javascript">
function makeRandomIntFn(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
var w = 600, h = 250, pad = 25, r = 2.5;
var seventh = (w - (r * 2))/7;
var defaultN = 5000, defaultDuration = 250;
// startDate is 2015-01-01T00:00:00.000Z; endDate is 2016-01-01T00:00:00.000Z
var startDate = 1420070400000, endDate = 1451606400000;
var svg = d3.select("#main").append('svg')
// white background to give us a canvas
var timeScale = d3.time.scale.utc()
.domain([startDate, endDate])
var split = false, shifted = false;
var weekdayScale = d3.time.scale.utc()
.domain([startDate, endDate])
.range([r, seventh * 5 - r]);
var weekendScale = d3.time.scale.utc()
.domain([startDate, endDate])
.range([r + seventh * 5, w - r]);
var valueScale = d3.scale.linear()
.range([h - r + pad, r + pad]);
var dayOfWeekScale = d3.scale.ordinal()
.domain(['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'])
.range(colorbrewer.Set2[7]);
var randomValue = makeRandomIntFn(0, max);
var randomDate = makeRandomIntFn(startDate, endDate);
var dataGenTime, dataDrawTime, dataShiftTime;
function generateData(n) {
for (var i = 0; i < n; ++i) {
var dt = new Date(randomDate());
dayOfWeek: moment(dt).format('dddd').toLowerCase()
dataGenTime = new Date() - start;
d3.select('#dataGenSpan').html(dataGenTime);
function generateDataSlow(n) {
for (var i = 0; i < n; ++i) {
var dt = new Date(randomDate()).toISOString();
timestamp: Date.parse(dt),
dayOfWeek: moment(dt).format('dddd').toLowerCase()
dataGenTime = new Date() - start;
d3.select('#dataGenSpan').html(dataGenTime);
cx: function(d) { return timeScale(d.timestamp); },
cy: function(d) { return valueScale(d.value); },
return dayOfWeekScale(d.dayOfWeek);
dataDrawTime = new Date() - start;
d3.select('#dataDrawSpan').html(dataDrawTime);
.delay(function(d, i) { return i * defaultDuration/max; })
cy: function(d) { return valueScale(max - d.value); }
data = _.map(data, function(d) {
function clearCircles() {
function generateAndDrawData() {
var num = d3.select('#numDataPoints')[0][0].value;
if (d3.select('#slowCheckboxGen').property('checked')) {
function splitOrUnsplitData() {
cx: function(d) { return timeScale(d.timestamp); }
d3.select('#splitButton').html('Split');
if (_.includes(['saturday', 'sunday'], d.dayOfWeek)) {
return weekendScale(d.timestamp);
return weekdayScale(d.timestamp);
d3.select('#splitButton').html('Unsplit');
function shiftOrUnshiftData() {
if (d3.select('#slowCheckboxShift').property('checked')) {
transform: 'translate(0,0)'
d3.select('#shiftButton').html('Shift');
transform: 'translate(0,-' + pad + ')'
d3.select('#shiftButton').html('Unshift');
transform: 'translate(0,0)'
d3.select('#shiftButton').html('Shift');
transform: 'translate(0,-' + pad + ')'
d3.select('#shiftButton').html('Unshift');
dataShiftTime = new Date() - start;
d3.select('#shiftReport')
.classed('hidden', false)
d3.select('#dataShiftSpan')