rickshaw
Version:
Rickshaw is a JavaScript toolkit for creating interactive time series graphs, developed at [Shutterstock](http://www.shutterstock.com)
161 lines (118 loc) • 3.19 kB
JavaScript
Rickshaw.namespace('Rickshaw.Series');
Rickshaw.Series = Rickshaw.Class.create( Array, {
initialize: function (data, palette, options) {
options = options || {}
this.palette = new Rickshaw.Color.Palette(palette);
this.timeBase = typeof(options.timeBase) === 'undefined' ?
Math.floor(new Date().getTime() / 1000) :
options.timeBase;
var timeInterval = typeof(options.timeInterval) == 'undefined' ?
1000 :
options.timeInterval;
this.setTimeInterval(timeInterval);
if (data && (typeof(data) == "object") && (data instanceof Array)) {
data.forEach( function(item) { this.addItem(item) }, this );
}
},
addItem: function(item) {
if (typeof(item.name) === 'undefined') {
throw('addItem() needs a name');
}
item.color = (item.color || this.palette.color(item.name));
item.data = (item.data || []);
// backfill, if necessary
if ((item.data.length == 0) && this.length && (this.getIndex() > 0)) {
this[0].data.forEach( function(plot) {
item.data.push({ x: plot.x, y: 0 });
} );
} else if (item.data.length == 0) {
item.data.push({ x: this.timeBase - (this.timeInterval || 0), y: 0 });
}
this.push(item);
if (this.legend) {
this.legend.addLine(this.itemByName(item.name));
}
},
addData: function(data) {
var index = this.getIndex();
Rickshaw.keys(data).forEach( function(name) {
if (! this.itemByName(name)) {
this.addItem({ name: name });
}
}, this );
this.forEach( function(item) {
item.data.push({
x: (index * this.timeInterval || 1) + this.timeBase,
y: (data[item.name] || 0)
});
}, this );
},
getIndex: function () {
return (this[0] && this[0].data && this[0].data.length) ? this[0].data.length : 0;
},
itemByName: function(name) {
for (var i = 0; i < this.length; i++) {
if (this[i].name == name)
return this[i];
}
},
setTimeInterval: function(iv) {
this.timeInterval = iv / 1000;
},
setTimeBase: function (t) {
this.timeBase = t;
},
dump: function() {
var data = {
timeBase: this.timeBase,
timeInterval: this.timeInterval,
items: []
};
this.forEach( function(item) {
var newItem = {
color: item.color,
name: item.name,
data: []
};
item.data.forEach( function(plot) {
newItem.data.push({ x: plot.x, y: plot.y });
} );
data.items.push(newItem);
} );
return data;
},
load: function(data) {
if (data.timeInterval) {
this.timeInterval = data.timeInterval;
}
if (data.timeBase) {
this.timeBase = data.timeBase;
}
if (data.items) {
data.items.forEach( function(item) {
this.push(item);
if (this.legend) {
this.legend.addLine(this.itemByName(item.name));
}
}, this );
}
}
} );
Rickshaw.Series.zeroFill = function(series) {
var x;
var i = 0;
var data = series.map( function(s) { return s.data } );
while ( i < Math.max.apply(null, data.map( function(d) { return d.length } )) ) {
x = Math.min.apply( null,
data
.filter(function(d) { return d[i] })
.map(function(d) { return d[i].x })
);
data.forEach( function(d) {
if (!d[i] || d[i].x != x) {
d.splice(i, 0, { x: x, y: 0 });
}
} );
i++;
}
};