/** * Line Chart */ var LineChart = (function() { // default configuration var _DEFAULT_CONFIG = { id: 'chart', marginTop: 10, marginRight: 10, marginBottom: 10, marginLeft: 10, width: 600, height: 140 }; // configuration var _config = {}; // scales var _scales = {}; // line handle var _line = d3.svg.line() .interpolate('basis') .x(function(d) { return _scales.x(d.timestamp); }) .y(function(d) { return _scales.y(d.value); }); // svg handle var _svg = null; // data array var _data = []; // get series range // first and last element are cutted out to paint a more precise line var _seriesRange = function(accessor) { var seriesRanges = []; _data.map(function(series) { d3.extent(series.filter(function(d, i) { return i > 0 && i < series.length - 1; }), accessor).map(function(d) { seriesRanges.push(d); }); }); return d3.extent(seriesRanges); }; return { /** * getter/setter for configuration * @param {object} config configuration * @returns {*} */ config: function(config) { if (typeof config === 'undefined') { return _config; } _config = config; var id = _config.id || _DEFAULT_CONFIG.id; var width = _config.width || _DEFAULT_CONFIG.width; var height = _config.height || _DEFAULT_CONFIG.height; var marginTop = _config.marginTop || _DEFAULT_CONFIG.marginTop; var marginRight = _config.marginRight || _DEFAULT_CONFIG.marginRight; var marginBottom = _config.marginBottom || _DEFAULT_CONFIG.marginBottom; var marginLeft = _config.marginLeft || _DEFAULT_CONFIG.marginLeft; // update scales _scales.x = d3.time.scale().range([0, width]); _scales.y = d3.scale.linear().range([height, 0]); _scales.color = d3.scale.category10(); // init svg _svg = d3.select(id) .append('svg') .attr('width', width + marginLeft + marginRight) .attr('height', height + marginTop + marginBottom) .append('g') .attr('transform', 'translate(' + marginLeft + ',' + marginRight + ')'); // clipping path _svg.append('defs').append('clipPath') .attr('id', 'clip') .append('rect') .attr('width', width - marginLeft - marginRight) .attr('height', height - marginTop - marginBottom) .attr('x', marginLeft) .attr('y', marginTop); return this; }, /** * getter/setter for data * @param {array} data data * @returns {*} */ data: function(data) { if (typeof data === 'undefined') { return _data; } _data = data; return this; }, /** * draw chart * @param {function} ready ready callback * @returns {LineChart} */ draw: function(ready) { // update scale domains _scales.x.domain(_seriesRange(function(d) { return d.timestamp; })); /* _scales.y.domain(_seriesRange(function(d) { return d.value; })); */ _scales.y.domain([80, 20]); _svg.selectAll('.series') .data(data) .enter() .append('g') .attr('clip-path', 'url(#clip)') .attr('class', 'series') .append('path') .attr('class', 'line') .attr('stroke', function(d, i) { return _scales.color(i); }); _svg.selectAll('.line') .attr('d', function(d) { return _line(d); }) .attr('transform', null) .transition() .duration(950) .ease('linear') .attr('transform', function(d) { return 'translate(' + _scales.x(d[0].timestamp) + ')'; }) .each('end', function(d, i) { if (i === _data.length - 1) { ready(); } }); return this; }, /** * get scales * @returns {} */ scales: function() { return _scales; } }; })();