From 680241cbb652ee29088baa6cde2da02002e5ec47 Mon Sep 17 00:00:00 2001 From: Igor Sfiligoi Date: Thu, 7 Nov 2013 12:50:35 -0500 Subject: flot-0.8.1-tooltip-0.6.2 --- jquery.flot.threshold.js | 111 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 36 deletions(-) (limited to 'jquery.flot.threshold.js') diff --git a/jquery.flot.threshold.js b/jquery.flot.threshold.js index 0b2e7ac..2f6e635 100644 --- a/jquery.flot.threshold.js +++ b/jquery.flot.threshold.js @@ -1,26 +1,45 @@ -/* -Flot plugin for thresholding data. Controlled through the option -"threshold" in either the global series options - - series: { - threshold: { - below: number - color: colorspec - } - } +/* Flot plugin for thresholding data. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + series: { + threshold: { + below: number + color: colorspec + } + } + +It can also be applied to a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + threshold: { ... } + }]) -or in a specific series +An array can be passed for multiple thresholding, like this: - $.plot($("#placeholder"), [{ data: [ ... ], threshold: { ... }}]) + threshold: [{ + below: number1 + color: color1 + },{ + below: number2 + color: color2 + }] -The data points below "below" are drawn with the specified color. This -makes it easy to mark points below 0, e.g. for budget data. +These multiple threshold objects can be passed in any order since they are +sorted by the processing function. + +The data points below "below" are drawn with the specified color. This makes +it easy to mark points below 0, e.g. for budget data. + +Internally, the plugin works by splitting the data into two series, above and +below the threshold. The extra series below the threshold will have its label +cleared and the special "originSeries" attribute set to the original series. +You may need to check for this in hover events. -Internally, the plugin works by splitting the data into two series, -above and below the threshold. The extra series below the threshold -will have its label cleared and the special "originSeries" attribute -set to the original series. You may need to check for this in hover -events. */ (function ($) { @@ -29,29 +48,26 @@ events. }; function init(plot) { - function thresholdData(plot, s, datapoints) { - if (!s.threshold) - return; - + function thresholdData(plot, s, datapoints, below, color) { var ps = datapoints.pointsize, i, x, y, p, prevp, thresholded = $.extend({}, s); // note: shallow copy - thresholded.datapoints = { points: [], pointsize: ps }; + thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format }; thresholded.label = null; - thresholded.color = s.threshold.color; + thresholded.color = color; thresholded.threshold = null; thresholded.originSeries = s; thresholded.data = []; - - var below = s.threshold.below, - origpoints = datapoints.points, + + var origpoints = datapoints.points, addCrossingPoints = s.lines.show; - threspoints = []; - newpoints = []; + var threspoints = []; + var newpoints = []; + var m; for (i = 0; i < origpoints.length; i += ps) { - x = origpoints[i] + x = origpoints[i]; y = origpoints[i + 1]; prevp = p; @@ -62,7 +78,7 @@ events. if (addCrossingPoints && prevp != p && x != null && i > 0 && origpoints[i - ps] != null) { - var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x; + var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]); prevp.push(interx); prevp.push(below); for (m = 2; m < ps; ++m) @@ -80,24 +96,47 @@ events. p.push(x); p.push(y); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); } datapoints.points = newpoints; thresholded.datapoints.points = threspoints; - if (thresholded.datapoints.points.length > 0) - plot.getData().push(thresholded); + if (thresholded.datapoints.points.length > 0) { + var origIndex = $.inArray(s, plot.getData()); + // Insert newly-generated series right after original one (to prevent it from becoming top-most) + plot.getData().splice(origIndex + 1, 0, thresholded); + } // FIXME: there are probably some edge cases left in bars } - plot.hooks.processDatapoints.push(thresholdData); + function processThresholds(plot, s, datapoints) { + if (!s.threshold) + return; + + if (s.threshold instanceof Array) { + s.threshold.sort(function(a, b) { + return a.below - b.below; + }); + + $(s.threshold).each(function(i, th) { + thresholdData(plot, s, datapoints, th.below, th.color); + }); + } + else { + thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color); + } + } + + plot.hooks.processDatapoints.push(processThresholds); } $.plot.plugins.push({ init: init, options: options, name: 'threshold', - version: '1.0' + version: '1.2' }); })(jQuery); -- cgit v1.2.3