diff options
Diffstat (limited to 'tipboard/tiles/line_chart.js')
-rw-r--r-- | tipboard/tiles/line_chart.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tipboard/tiles/line_chart.js b/tipboard/tiles/line_chart.js index 0d91fbe..b4a023c 100644 --- a/tipboard/tiles/line_chart.js +++ b/tipboard/tiles/line_chart.js @@ -1,6 +1,69 @@ /*jslint browser: true, devel: true*/ /*global WebSocket: false, Tipboard: false*/ +function simplifyLineData(series_data, user_config) { + var config = { + tolerancy: 10, + data_points_limit: 50, // we will TRY to achieve lower number of data points than this + max_simplifying_steps: 5, + simplify_step_multiplicator: 1.5 + }; + + $.extend(config, user_config); + + var simplify_data = new Array(); + var return_data = new Array(); + + for(var series = 0; series < series_data.length; series++) { + simplify_data[series] = new Array(); + return_data[series] = new Array(); + + // converting data to format acceptable by simplify.js library + if(typeof series_data[series][0] === typeof []) { + for(var tick = 0; tick < series_data[series].length; tick++) { + simplify_data[series].push({ + x: tick, + y: series_data[series][tick][1], + key: series_data[series][tick][0] + }); + } + } else { + for(var tick = 0; tick < series_data[series].length; tick++) { + simplify_data[series].push({ + x: tick, + y: series_data[series][tick], + key: null + }); + } + } + + var current_tolerance = config.tolerancy; + for(var i = 0; i < config.max_simplifying_steps; i++) { + simplify_data[series] = simplify(simplify_data[series], current_tolerance); + if(simplify_data[series].length < config.data_points_limit) break; + current_tolerance = Math.floor(current_tolerance * config.simplify_step_multiplicator); + } + + // prepare in data format understandable by jqplot + for(var tick = 0; tick < simplify_data[series].length; tick++) { + if(simplify_data[series][tick].key != null) + return_data[series][tick] = [ + simplify_data[series][tick].key, + simplify_data[series][tick].y + ]; + else + return_data[series][simplify_data[series][tick].x] = simplify_data[series][tick].y; + } + + // fill all created gaps with null for jqplot + for(var i = 0; i < return_data[series].length; i++) { + if(!return_data[series][i]) + return_data[series][i] = null; + } + } + + return return_data; +} function updateTileLine(tileId, data, meta, tipboard) { var tile = Tipboard.Dashboard.id2node(tileId); @@ -21,6 +84,9 @@ function updateTileLine(tileId, data, meta, tipboard) { // TODO use Tipboard.Dashboard.buildChart Tipboard.DisplayUtils.expandLastChild(tile); Tipboard.DisplayUtils.expandLastChild($(tile).find('.tile-content')[0]); + + if(config.simplify) data.series_list = simplifyLineData(data.series_list, config.simplify); + Tipboard.Dashboard.chartsIds[tileId] = $.jqplot( tileId + '-chart', data.series_list, config ); |