flot-rails 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/flot/rails/version.rb +2 -2
- data/vendor/assets/javascripts/jquery.colorhelpers.js +3 -2
- data/vendor/assets/javascripts/jquery.colorhelpers.min.js +1 -21
- data/vendor/assets/javascripts/jquery.flot.canvas.min.js +1 -28
- data/vendor/assets/javascripts/jquery.flot.categories.min.js +1 -44
- data/vendor/assets/javascripts/jquery.flot.crosshair.min.js +1 -59
- data/vendor/assets/javascripts/jquery.flot.errorbars.min.js +1 -63
- data/vendor/assets/javascripts/jquery.flot.fillbetween.min.js +1 -30
- data/vendor/assets/javascripts/jquery.flot.image.min.js +1 -53
- data/vendor/assets/javascripts/jquery.flot.js +151 -75
- data/vendor/assets/javascripts/jquery.flot.min.js +2 -29
- data/vendor/assets/javascripts/jquery.flot.navigate.min.js +1 -86
- data/vendor/assets/javascripts/jquery.flot.pie.js +6 -6
- data/vendor/assets/javascripts/jquery.flot.pie.min.js +1 -56
- data/vendor/assets/javascripts/jquery.flot.resize.js +1 -1
- data/vendor/assets/javascripts/jquery.flot.resize.min.js +1 -19
- data/vendor/assets/javascripts/jquery.flot.selection.min.js +1 -79
- data/vendor/assets/javascripts/jquery.flot.stack.min.js +1 -36
- data/vendor/assets/javascripts/jquery.flot.symbol.min.js +1 -14
- data/vendor/assets/javascripts/jquery.flot.threshold.min.js +1 -43
- data/vendor/assets/javascripts/jquery.flot.time.min.js +1 -9
- metadata +12 -21
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 854741497e7baa12b564432c785a81928abfc8f9
|
4
|
+
data.tar.gz: a59ccf685ed4b437e76139ebe84d85b28e2429eb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e8fddd3f69226e58cff2faf1ea1e150e0be07ef4b5b670115c765ac28adf7b2aa78feda9949705432cb2852de9f3fe56c54051a0f2d78c7067468ac23a5631ed
|
7
|
+
data.tar.gz: b59be6ffde468f138fddce39bfb70e8bc06c0dc893559c24f5455847b22243b6abe5ba59ff6ac6e4595260677e6da718cf98fd5ea56f7b4ce4826477be9b6ab4
|
data/lib/flot/rails/version.rb
CHANGED
@@ -74,14 +74,15 @@
|
|
74
74
|
// if it's "transparent"
|
75
75
|
$.color.extract = function (elem, css) {
|
76
76
|
var c;
|
77
|
+
|
77
78
|
do {
|
78
79
|
c = elem.css(css).toLowerCase();
|
79
80
|
// keep going until we find an element that has color, or
|
80
|
-
// we hit the body
|
81
|
+
// we hit the body or root (have no parent)
|
81
82
|
if (c != '' && c != 'transparent')
|
82
83
|
break;
|
83
84
|
elem = elem.parent();
|
84
|
-
} while (!$.nodeName(elem.get(0), "body"));
|
85
|
+
} while (elem.length && !$.nodeName(elem.get(0), "body"));
|
85
86
|
|
86
87
|
// catch Safari's way of signalling transparent
|
87
88
|
if (c == "rgba(0, 0, 0, 0)")
|
@@ -1,21 +1 @@
|
|
1
|
-
|
2
|
-
*
|
3
|
-
* Version 1.1.
|
4
|
-
*
|
5
|
-
* Inspiration from jQuery color animation plugin by John Resig.
|
6
|
-
*
|
7
|
-
* Released under the MIT license by Ole Laursen, October 2009.
|
8
|
-
*
|
9
|
-
* Examples:
|
10
|
-
*
|
11
|
-
* $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
|
12
|
-
* var c = $.color.extract($("#mydiv"), 'background-color');
|
13
|
-
* console.log(c.r, c.g, c.b, c.a);
|
14
|
-
* $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
|
15
|
-
*
|
16
|
-
* Note that .scale() and .add() return the same modified object
|
17
|
-
* instead of making a new one.
|
18
|
-
*
|
19
|
-
* V. 1.1: Fix error handling so e.g. parsing an empty string does
|
20
|
-
* produce a color rather than just crashing.
|
21
|
-
*/(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
|
1
|
+
(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
|
@@ -1,28 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
Flot normally produces certain elements, like axis labels and the legend, using
|
7
|
-
HTML elements. This permits greater interactivity and customization, and often
|
8
|
-
looks better, due to cross-browser canvas text inconsistencies and limitations.
|
9
|
-
|
10
|
-
It can also be desirable to render the plot entirely in canvas, particularly
|
11
|
-
if the goal is to save it as an image, or if Flot is being used in a context
|
12
|
-
where the HTML DOM does not exist, as is the case within Node.js. This plugin
|
13
|
-
switches out Flot's standard drawing operations for canvas-only replacements.
|
14
|
-
|
15
|
-
Currently the plugin supports only axis labels, but it will eventually allow
|
16
|
-
every element of the plot to be rendered directly to canvas.
|
17
|
-
|
18
|
-
The plugin supports these options:
|
19
|
-
|
20
|
-
{
|
21
|
-
canvas: boolean
|
22
|
-
}
|
23
|
-
|
24
|
-
The "canvas" option controls whether full canvas drawing is enabled, making it
|
25
|
-
possible to toggle on and off. This is useful when a plot uses HTML text in the
|
26
|
-
browser, but needs to redraw with canvas text when exporting as an image.
|
27
|
-
|
28
|
-
*/(function(e){function o(t,o){var u=o.Canvas;n==null&&(r=u.prototype.getTextInfo,i=u.prototype.addText,n=u.prototype.render),u.prototype.render=function(){if(!t.getOptions().canvas)return n.call(this);var e=this.context,r=this._textCache;e.save(),e.textBaseline="middle";for(var i in r)if(s.call(r,i)){var o=r[i];for(var u in o)if(s.call(o,u)){var a=o[u],f=!0;for(var l in a)if(s.call(a,l)){var c=a[l],h=c.positions,p=c.lines;f&&(e.fillStyle=c.font.color,e.font=c.font.definition,f=!1);for(var d=0,v;v=h[d];d++)if(v.active)for(var m=0,g;g=v.lines[m];m++)e.fillText(p[m].text,g[0],g[1]);else h.splice(d--,1);h.length==0&&delete a[l]}}}e.restore()},u.prototype.getTextInfo=function(n,i,s,o,u){if(!t.getOptions().canvas)return r.call(this,n,i,s,o,u);var a,f,l,c;i=""+i,typeof s=="object"?a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family:a=s,f=this._textCache[n],f==null&&(f=this._textCache[n]={}),l=f[a],l==null&&(l=f[a]={}),c=l[i];if(c==null){var h=this.context;if(typeof s!="object"){var p=e("<div> </div>").css("position","absolute").addClass(typeof s=="string"?s:null).appendTo(this.getTextLayer(n));s={lineHeight:p.height(),style:p.css("font-style"),variant:p.css("font-variant"),weight:p.css("font-weight"),family:p.css("font-family"),color:p.css("color")},s.size=p.css("line-height",1).height(),p.remove()}a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family,c=l[i]={width:0,height:0,positions:[],lines:[],font:{definition:a,color:s.color}},h.save(),h.font=a;var d=(i+"").replace(/<br ?\/?>|\r\n|\r/g,"\n").split("\n");for(var v=0;v<d.length;++v){var m=d[v],g=h.measureText(m);c.width=Math.max(g.width,c.width),c.height+=s.lineHeight,c.lines.push({text:m,width:g.width,height:s.lineHeight})}h.restore()}return c},u.prototype.addText=function(e,n,r,s,o,u,a,f,l){if(!t.getOptions().canvas)return i.call(this,e,n,r,s,o,u,a,f,l);var c=this.getTextInfo(e,s,o,u,a),h=c.positions,p=c.lines;r+=c.height/p.length/2,l=="middle"?r=Math.round(r-c.height/2):l=="bottom"?r=Math.round(r-c.height):r=Math.round(r),!(window.opera&&window.opera.version().split(".")[0]<12)||(r-=2);for(var d=0,v;v=h[d];d++)if(v.x==n&&v.y==r){v.active=!0;return}v={active:!0,lines:[],x:n,y:r},h.push(v);for(var d=0,m;m=p[d];d++)f=="center"?v.lines.push([Math.round(n-m.width/2),r]):f=="right"?v.lines.push([Math.round(n-m.width),r]):v.lines.push([Math.round(n),r]),r+=m.height}}var t={canvas:!0},n,r,i,s=Object.prototype.hasOwnProperty;e.plot.plugins.push({init:o,options:t,name:"canvas",version:"1.0"})})(jQuery);
|
1
|
+
(function($){var options={canvas:true};var render,getTextInfo,addText;var hasOwnProperty=Object.prototype.hasOwnProperty;function init(plot,classes){var Canvas=classes.Canvas;if(render==null){getTextInfo=Canvas.prototype.getTextInfo,addText=Canvas.prototype.addText,render=Canvas.prototype.render}Canvas.prototype.render=function(){if(!plot.getOptions().canvas){return render.call(this)}var context=this.context,cache=this._textCache;context.save();context.textBaseline="middle";for(var layerKey in cache){if(hasOwnProperty.call(cache,layerKey)){var layerCache=cache[layerKey];for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey],updateStyles=true;for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var info=styleCache[key],positions=info.positions,lines=info.lines;if(updateStyles){context.fillStyle=info.font.color;context.font=info.font.definition;updateStyles=false}for(var i=0,position;position=positions[i];i++){if(position.active){for(var j=0,line;line=position.lines[j];j++){context.fillText(lines[j].text,line[0],line[1])}}else{positions.splice(i--,1)}}if(positions.length==0){delete styleCache[key]}}}}}}}context.restore()};Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){if(!plot.getOptions().canvas){return getTextInfo.call(this,layer,text,font,angle,width)}var textStyle,layerCache,styleCache,info;text=""+text;if(typeof font==="object"){textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px "+font.family}else{textStyle=font}layerCache=this._textCache[layer];if(layerCache==null){layerCache=this._textCache[layer]={}}styleCache=layerCache[textStyle];if(styleCache==null){styleCache=layerCache[textStyle]={}}info=styleCache[text];if(info==null){var context=this.context;if(typeof font!=="object"){var element=$("<div> </div>").css("position","absolute").addClass(typeof font==="string"?font:null).appendTo(this.getTextLayer(layer));font={lineHeight:element.height(),style:element.css("font-style"),variant:element.css("font-variant"),weight:element.css("font-weight"),family:element.css("font-family"),color:element.css("color")};font.size=element.css("line-height",1).height();element.remove()}textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px "+font.family;info=styleCache[text]={width:0,height:0,positions:[],lines:[],font:{definition:textStyle,color:font.color}};context.save();context.font=textStyle;var lines=(text+"").replace(/<br ?\/?>|\r\n|\r/g,"\n").split("\n");for(var i=0;i<lines.length;++i){var lineText=lines[i],measured=context.measureText(lineText);info.width=Math.max(measured.width,info.width);info.height+=font.lineHeight;info.lines.push({text:lineText,width:measured.width,height:font.lineHeight})}context.restore()}return info};Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){if(!plot.getOptions().canvas){return addText.call(this,layer,x,y,text,font,angle,width,halign,valign)}var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions,lines=info.lines;y+=info.height/lines.length/2;if(valign=="middle"){y=Math.round(y-info.height/2)}else if(valign=="bottom"){y=Math.round(y-info.height)}else{y=Math.round(y)}if(!!(window.opera&&window.opera.version().split(".")[0]<12)){y-=2}for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=true;return}}position={active:true,lines:[],x:x,y:y};positions.push(position);for(var i=0,line;line=lines[i];i++){if(halign=="center"){position.lines.push([Math.round(x-line.width/2),y])}else if(halign=="right"){position.lines.push([Math.round(x-line.width),y])}else{position.lines.push([Math.round(x),y])}y+=line.height}}}$.plot.plugins.push({init:init,options:options,name:"canvas",version:"1.0"})})(jQuery);
|
@@ -1,44 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin
|
7
|
-
allows you to plot such a dataset directly.
|
8
|
-
|
9
|
-
To enable it, you must specify mode: "categories" on the axis with the textual
|
10
|
-
labels, e.g.
|
11
|
-
|
12
|
-
$.plot("#placeholder", data, { xaxis: { mode: "categories" } });
|
13
|
-
|
14
|
-
By default, the labels are ordered as they are met in the data series. If you
|
15
|
-
need a different ordering, you can specify "categories" on the axis options
|
16
|
-
and list the categories there:
|
17
|
-
|
18
|
-
xaxis: {
|
19
|
-
mode: "categories",
|
20
|
-
categories: ["February", "March", "April"]
|
21
|
-
}
|
22
|
-
|
23
|
-
If you need to customize the distances between the categories, you can specify
|
24
|
-
"categories" as an object mapping labels to values
|
25
|
-
|
26
|
-
xaxis: {
|
27
|
-
mode: "categories",
|
28
|
-
categories: { "February": 1, "March": 3, "April": 4 }
|
29
|
-
}
|
30
|
-
|
31
|
-
If you don't specify all categories, the remaining categories will be numbered
|
32
|
-
from the max value plus 1 (with a spacing of 1 between each).
|
33
|
-
|
34
|
-
Internally, the plugin works by transforming the input data through an auto-
|
35
|
-
generated mapping where the first category becomes 0, the second 1, etc.
|
36
|
-
Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this
|
37
|
-
is visible in hover and click events that return numbers rather than the
|
38
|
-
category labels). The plugin also overrides the tick generator to spit out the
|
39
|
-
categories as ticks instead of the values.
|
40
|
-
|
41
|
-
If you need to map a value back to its label, the mapping is always accessible
|
42
|
-
as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories.
|
43
|
-
|
44
|
-
*/(function(e){function n(e,t,n,r){var i=t.xaxis.options.mode=="categories",s=t.yaxis.options.mode=="categories";if(!i&&!s)return;var o=r.format;if(!o){var u=t;o=[],o.push({x:!0,number:!0,required:!0}),o.push({y:!0,number:!0,required:!0});if(u.bars.show||u.lines.show&&u.lines.fill){var a=!!(u.bars.show&&u.bars.zero||u.lines.show&&u.lines.zero);o.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:a}),u.bars.horizontal&&(delete o[o.length-1].y,o[o.length-1].x=!0)}r.format=o}for(var f=0;f<o.length;++f)o[f].x&&i&&(o[f].number=!1),o[f].y&&s&&(o[f].number=!1)}function r(e){var t=-1;for(var n in e)e[n]>t&&(t=e[n]);return t+1}function i(e){var t=[];for(var n in e.categories){var r=e.categories[n];r>=e.min&&r<=e.max&&t.push([r,n])}return t.sort(function(e,t){return e[0]-t[0]}),t}function s(t,n,r){if(t[n].options.mode!="categories")return;if(!t[n].categories){var s={},u=t[n].options.categories||{};if(e.isArray(u))for(var a=0;a<u.length;++a)s[u[a]]=a;else for(var f in u)s[f]=u[f];t[n].categories=s}t[n].options.ticks||(t[n].options.ticks=i),o(r,n,t[n].categories)}function o(e,t,n){var i=e.points,s=e.pointsize,o=e.format,u=t.charAt(0),a=r(n);for(var f=0;f<i.length;f+=s){if(i[f]==null)continue;for(var l=0;l<s;++l){var c=i[f+l];if(c==null||!o[l][u])continue;c in n||(n[c]=a,++a),i[f+l]=n[c]}}}function u(e,t,n){s(t,"xaxis",n),s(t,"yaxis",n)}function a(e){e.hooks.processRawData.push(n),e.hooks.processDatapoints.push(u)}var t={xaxis:{categories:null},yaxis:{categories:null}};e.plot.plugins.push({init:a,options:t,name:"categories",version:"1.0"})})(jQuery);
|
1
|
+
(function($){var options={xaxis:{categories:null},yaxis:{categories:null}};function processRawData(plot,series,data,datapoints){var xCategories=series.xaxis.options.mode=="categories",yCategories=series.yaxis.options.mode=="categories";if(!(xCategories||yCategories))return;var format=datapoints.format;if(!format){var s=series;format=[];format.push({x:true,number:true,required:true});format.push({y:true,number:true,required:true});if(s.bars.show||s.lines.show&&s.lines.fill){var autoscale=!!(s.bars.show&&s.bars.zero||s.lines.show&&s.lines.zero);format.push({y:true,number:true,required:false,defaultValue:0,autoscale:autoscale});if(s.bars.horizontal){delete format[format.length-1].y;format[format.length-1].x=true}}datapoints.format=format}for(var m=0;m<format.length;++m){if(format[m].x&&xCategories)format[m].number=false;if(format[m].y&&yCategories)format[m].number=false}}function getNextIndex(categories){var index=-1;for(var v in categories)if(categories[v]>index)index=categories[v];return index+1}function categoriesTickGenerator(axis){var res=[];for(var label in axis.categories){var v=axis.categories[label];if(v>=axis.min&&v<=axis.max)res.push([v,label])}res.sort(function(a,b){return a[0]-b[0]});return res}function setupCategoriesForAxis(series,axis,datapoints){if(series[axis].options.mode!="categories")return;if(!series[axis].categories){var c={},o=series[axis].options.categories||{};if($.isArray(o)){for(var i=0;i<o.length;++i)c[o[i]]=i}else{for(var v in o)c[v]=o[v]}series[axis].categories=c}if(!series[axis].options.ticks)series[axis].options.ticks=categoriesTickGenerator;transformPointsOnAxis(datapoints,axis,series[axis].categories)}function transformPointsOnAxis(datapoints,axis,categories){var points=datapoints.points,ps=datapoints.pointsize,format=datapoints.format,formatColumn=axis.charAt(0),index=getNextIndex(categories);for(var i=0;i<points.length;i+=ps){if(points[i]==null)continue;for(var m=0;m<ps;++m){var val=points[i+m];if(val==null||!format[m][formatColumn])continue;if(!(val in categories)){categories[val]=index;++index}points[i+m]=categories[val]}}}function processDatapoints(plot,series,datapoints){setupCategoriesForAxis(series,"xaxis",datapoints);setupCategoriesForAxis(series,"yaxis",datapoints)}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.processDatapoints.push(processDatapoints)}$.plot.plugins.push({init:init,options:options,name:"categories",version:"1.0"})})(jQuery);
|
@@ -1,59 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
The plugin supports these options:
|
7
|
-
|
8
|
-
crosshair: {
|
9
|
-
mode: null or "x" or "y" or "xy"
|
10
|
-
color: color
|
11
|
-
lineWidth: number
|
12
|
-
}
|
13
|
-
|
14
|
-
Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
|
15
|
-
crosshair that lets you trace the values on the x axis, "y" enables a
|
16
|
-
horizontal crosshair and "xy" enables them both. "color" is the color of the
|
17
|
-
crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
|
18
|
-
the drawn lines (default is 1).
|
19
|
-
|
20
|
-
The plugin also adds four public methods:
|
21
|
-
|
22
|
-
- setCrosshair( pos )
|
23
|
-
|
24
|
-
Set the position of the crosshair. Note that this is cleared if the user
|
25
|
-
moves the mouse. "pos" is in coordinates of the plot and should be on the
|
26
|
-
form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
|
27
|
-
axes), which is coincidentally the same format as what you get from a
|
28
|
-
"plothover" event. If "pos" is null, the crosshair is cleared.
|
29
|
-
|
30
|
-
- clearCrosshair()
|
31
|
-
|
32
|
-
Clear the crosshair.
|
33
|
-
|
34
|
-
- lockCrosshair(pos)
|
35
|
-
|
36
|
-
Cause the crosshair to lock to the current location, no longer updating if
|
37
|
-
the user moves the mouse. Optionally supply a position (passed on to
|
38
|
-
setCrosshair()) to move it to.
|
39
|
-
|
40
|
-
Example usage:
|
41
|
-
|
42
|
-
var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
|
43
|
-
$("#graph").bind( "plothover", function ( evt, position, item ) {
|
44
|
-
if ( item ) {
|
45
|
-
// Lock the crosshair to the data point being hovered
|
46
|
-
myFlot.lockCrosshair({
|
47
|
-
x: item.datapoint[ 0 ],
|
48
|
-
y: item.datapoint[ 1 ]
|
49
|
-
});
|
50
|
-
} else {
|
51
|
-
// Return normal crosshair operation
|
52
|
-
myFlot.unlockCrosshair();
|
53
|
-
}
|
54
|
-
});
|
55
|
-
|
56
|
-
- unlockCrosshair()
|
57
|
-
|
58
|
-
Free the crosshair to move again after locking it.
|
59
|
-
*/(function(e){function n(e){function n(n){if(t.locked)return;t.x!=-1&&(t.x=-1,e.triggerRedrawOverlay())}function r(n){if(t.locked)return;if(e.getSelection&&e.getSelection()){t.x=-1;return}var r=e.offset();t.x=Math.max(0,Math.min(n.pageX-r.left,e.width())),t.y=Math.max(0,Math.min(n.pageY-r.top,e.height())),e.triggerRedrawOverlay()}var t={x:-1,y:-1,locked:!1};e.setCrosshair=function(r){if(!r)t.x=-1;else{var i=e.p2c(r);t.x=Math.max(0,Math.min(i.left,e.width())),t.y=Math.max(0,Math.min(i.top,e.height()))}e.triggerRedrawOverlay()},e.clearCrosshair=e.setCrosshair,e.lockCrosshair=function(r){r&&e.setCrosshair(r),t.locked=!0},e.unlockCrosshair=function(){t.locked=!1},e.hooks.bindEvents.push(function(e,t){if(!e.getOptions().crosshair.mode)return;t.mouseout(n),t.mousemove(r)}),e.hooks.drawOverlay.push(function(e,n){var r=e.getOptions().crosshair;if(!r.mode)return;var i=e.getPlotOffset();n.save(),n.translate(i.left,i.top);if(t.x!=-1){var s=e.getOptions().crosshair.lineWidth%2===0?0:.5;n.strokeStyle=r.color,n.lineWidth=r.lineWidth,n.lineJoin="round",n.beginPath();if(r.mode.indexOf("x")!=-1){var o=Math.round(t.x)+s;n.moveTo(o,0),n.lineTo(o,e.height())}if(r.mode.indexOf("y")!=-1){var u=Math.round(t.y)+s;n.moveTo(0,u),n.lineTo(e.width(),u)}n.stroke()}n.restore()}),e.hooks.shutdown.push(function(e,t){t.unbind("mouseout",n),t.unbind("mousemove",r)})}var t={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};e.plot.plugins.push({init:n,options:t,name:"crosshair",version:"1.0"})})(jQuery);
|
1
|
+
(function($){var options={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function init(plot){var crosshair={x:-1,y:-1,locked:false};plot.setCrosshair=function setCrosshair(pos){if(!pos)crosshair.x=-1;else{var o=plot.p2c(pos);crosshair.x=Math.max(0,Math.min(o.left,plot.width()));crosshair.y=Math.max(0,Math.min(o.top,plot.height()))}plot.triggerRedrawOverlay()};plot.clearCrosshair=plot.setCrosshair;plot.lockCrosshair=function lockCrosshair(pos){if(pos)plot.setCrosshair(pos);crosshair.locked=true};plot.unlockCrosshair=function unlockCrosshair(){crosshair.locked=false};function onMouseOut(e){if(crosshair.locked)return;if(crosshair.x!=-1){crosshair.x=-1;plot.triggerRedrawOverlay()}}function onMouseMove(e){if(crosshair.locked)return;if(plot.getSelection&&plot.getSelection()){crosshair.x=-1;return}var offset=plot.offset();crosshair.x=Math.max(0,Math.min(e.pageX-offset.left,plot.width()));crosshair.y=Math.max(0,Math.min(e.pageY-offset.top,plot.height()));plot.triggerRedrawOverlay()}plot.hooks.bindEvents.push(function(plot,eventHolder){if(!plot.getOptions().crosshair.mode)return;eventHolder.mouseout(onMouseOut);eventHolder.mousemove(onMouseMove)});plot.hooks.drawOverlay.push(function(plot,ctx){var c=plot.getOptions().crosshair;if(!c.mode)return;var plotOffset=plot.getPlotOffset();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);if(crosshair.x!=-1){var adj=plot.getOptions().crosshair.lineWidth%2===0?0:.5;ctx.strokeStyle=c.color;ctx.lineWidth=c.lineWidth;ctx.lineJoin="round";ctx.beginPath();if(c.mode.indexOf("x")!=-1){var drawX=Math.round(crosshair.x)+adj;ctx.moveTo(drawX,0);ctx.lineTo(drawX,plot.height())}if(c.mode.indexOf("y")!=-1){var drawY=Math.round(crosshair.y)+adj;ctx.moveTo(0,drawY);ctx.lineTo(plot.width(),drawY)}ctx.stroke()}ctx.restore()});plot.hooks.shutdown.push(function(plot,eventHolder){eventHolder.unbind("mouseout",onMouseOut);eventHolder.unbind("mousemove",onMouseMove)})}$.plot.plugins.push({init:init,options:options,name:"crosshair",version:"1.0"})})(jQuery);
|
@@ -1,63 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
Error bars are used to show standard deviation and other statistical
|
7
|
-
properties in a plot.
|
8
|
-
|
9
|
-
* Created by Rui Pereira - rui (dot) pereira (at) gmail (dot) com
|
10
|
-
|
11
|
-
This plugin allows you to plot error-bars over points. Set "errorbars" inside
|
12
|
-
the points series to the axis name over which there will be error values in
|
13
|
-
your data array (*even* if you do not intend to plot them later, by setting
|
14
|
-
"show: null" on xerr/yerr).
|
15
|
-
|
16
|
-
The plugin supports these options:
|
17
|
-
|
18
|
-
series: {
|
19
|
-
points: {
|
20
|
-
errorbars: "x" or "y" or "xy",
|
21
|
-
xerr: {
|
22
|
-
show: null/false or true,
|
23
|
-
asymmetric: null/false or true,
|
24
|
-
upperCap: null or "-" or function,
|
25
|
-
lowerCap: null or "-" or function,
|
26
|
-
color: null or color,
|
27
|
-
radius: null or number
|
28
|
-
},
|
29
|
-
yerr: { same options as xerr }
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
Each data point array is expected to be of the type:
|
34
|
-
|
35
|
-
"x" [ x, y, xerr ]
|
36
|
-
"y" [ x, y, yerr ]
|
37
|
-
"xy" [ x, y, xerr, yerr ]
|
38
|
-
|
39
|
-
Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and
|
40
|
-
equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric
|
41
|
-
error-bars on X and asymmetric on Y would be:
|
42
|
-
|
43
|
-
[ x, y, xerr, yerr_lower, yerr_upper ]
|
44
|
-
|
45
|
-
By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will
|
46
|
-
draw a small cap perpendicular to the error bar. They can also be set to a
|
47
|
-
user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg.
|
48
|
-
|
49
|
-
function drawSemiCircle( ctx, x, y, radius ) {
|
50
|
-
ctx.beginPath();
|
51
|
-
ctx.arc( x, y, radius, 0, Math.PI, false );
|
52
|
-
ctx.moveTo( x - radius, y );
|
53
|
-
ctx.lineTo( x + radius, y );
|
54
|
-
ctx.stroke();
|
55
|
-
}
|
56
|
-
|
57
|
-
Color and radius both default to the same ones of the points series if not
|
58
|
-
set. The independent radius parameter on xerr/yerr is useful for the case when
|
59
|
-
we may want to add error-bars to a line, without showing the interconnecting
|
60
|
-
points (with radius: 0), and still showing end caps on the error-bars.
|
61
|
-
shadowSize and lineWidth are derived as well from the points series.
|
62
|
-
|
63
|
-
*/(function(e){function n(e,t,n,r){if(!t.points.errorbars)return;var i=[{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}],s=t.points.errorbars;if(s=="x"||s=="xy")t.points.xerr.asymmetric?(i.push({x:!0,number:!0,required:!0}),i.push({x:!0,number:!0,required:!0})):i.push({x:!0,number:!0,required:!0});if(s=="y"||s=="xy")t.points.yerr.asymmetric?(i.push({y:!0,number:!0,required:!0}),i.push({y:!0,number:!0,required:!0})):i.push({y:!0,number:!0,required:!0});r.format=i}function r(e,t){var n=e.datapoints.points,r=null,i=null,s=null,o=null,u=e.points.xerr,a=e.points.yerr,f=e.points.errorbars;f=="x"||f=="xy"?u.asymmetric?(r=n[t+2],i=n[t+3],f=="xy"&&(a.asymmetric?(s=n[t+4],o=n[t+5]):s=n[t+4])):(r=n[t+2],f=="xy"&&(a.asymmetric?(s=n[t+3],o=n[t+4]):s=n[t+3])):f=="y"&&(a.asymmetric?(s=n[t+2],o=n[t+3]):s=n[t+2]),i==null&&(i=r),o==null&&(o=s);var l=[r,i,s,o];return u.show||(l[0]=null,l[1]=null),a.show||(l[2]=null,l[3]=null),l}function i(e,t,n){var i=n.datapoints.points,o=n.datapoints.pointsize,u=[n.xaxis,n.yaxis],a=n.points.radius,f=[n.points.xerr,n.points.yerr],l=!1;if(u[0].p2c(u[0].max)<u[0].p2c(u[0].min)){l=!0;var c=f[0].lowerCap;f[0].lowerCap=f[0].upperCap,f[0].upperCap=c}var h=!1;if(u[1].p2c(u[1].min)<u[1].p2c(u[1].max)){h=!0;var c=f[1].lowerCap;f[1].lowerCap=f[1].upperCap,f[1].upperCap=c}for(var p=0;p<n.datapoints.points.length;p+=o){var d=r(n,p);for(var v=0;v<f.length;v++){var m=[u[v].min,u[v].max];if(d[v*f.length]){var g=i[p],y=i[p+1],b=[g,y][v]+d[v*f.length+1],w=[g,y][v]-d[v*f.length];if(f[v].err=="x")if(y>u[1].max||y<u[1].min||b<u[0].min||w>u[0].max)continue;if(f[v].err=="y")if(g>u[0].max||g<u[0].min||b<u[1].min||w>u[1].max)continue;var E=!0,S=!0;b>m[1]&&(E=!1,b=m[1]),w<m[0]&&(S=!1,w=m[0]);if(f[v].err=="x"&&l||f[v].err=="y"&&h){var c=w;w=b,b=c,c=S,S=E,E=c,c=m[0],m[0]=m[1],m[1]=c}g=u[0].p2c(g),y=u[1].p2c(y),b=u[v].p2c(b),w=u[v].p2c(w),m[0]=u[v].p2c(m[0]),m[1]=u[v].p2c(m[1]);var x=f[v].lineWidth?f[v].lineWidth:n.points.lineWidth,T=n.points.shadowSize!=null?n.points.shadowSize:n.shadowSize;if(x>0&&T>0){var N=T/2;t.lineWidth=N,t.strokeStyle="rgba(0,0,0,0.1)",s(t,f[v],g,y,b,w,E,S,a,N+N/2,m),t.strokeStyle="rgba(0,0,0,0.2)",s(t,f[v],g,y,b,w,E,S,a,N/2,m)}t.strokeStyle=f[v].color?f[v].color:n.color,t.lineWidth=x,s(t,f[v],g,y,b,w,E,S,a,0,m)}}}}function s(t,n,r,i,s,u,a,f,l,c,h){i+=c,s+=c,u+=c,n.err=="x"?(s>r+l?o(t,[[s,i],[Math.max(r+l,h[0]),i]]):a=!1,u<r-l?o(t,[[Math.min(r-l,h[1]),i],[u,i]]):f=!1):(s<i-l?o(t,[[r,s],[r,Math.min(i-l,h[0])]]):a=!1,u>i+l?o(t,[[r,Math.max(i+l,h[1])],[r,u]]):f=!1),l=n.radius!=null?n.radius:l,a&&(n.upperCap=="-"?n.err=="x"?o(t,[[s,i-l],[s,i+l]]):o(t,[[r-l,s],[r+l,s]]):e.isFunction(n.upperCap)&&(n.err=="x"?n.upperCap(t,s,i,l):n.upperCap(t,r,s,l))),f&&(n.lowerCap=="-"?n.err=="x"?o(t,[[u,i-l],[u,i+l]]):o(t,[[r-l,u],[r+l,u]]):e.isFunction(n.lowerCap)&&(n.err=="x"?n.lowerCap(t,u,i,l):n.lowerCap(t,r,u,l)))}function o(e,t){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(var n=1;n<t.length;n++)e.lineTo(t[n][0],t[n][1]);e.stroke()}function u(t,n){var r=t.getPlotOffset();n.save(),n.translate(r.left,r.top),e.each(t.getData(),function(e,r){r.points.errorbars&&(r.points.xerr.show||r.points.yerr.show)&&i(t,n,r)}),n.restore()}function a(e){e.hooks.processRawData.push(n),e.hooks.draw.push(u)}var t={series:{points:{errorbars:null,xerr:{err:"x",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null},yerr:{err:"y",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null}}}};e.plot.plugins.push({init:a,options:t,name:"errorbars",version:"1.0"})})(jQuery);
|
1
|
+
(function($){var options={series:{points:{errorbars:null,xerr:{err:"x",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null},yerr:{err:"y",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null}}}};function processRawData(plot,series,data,datapoints){if(!series.points.errorbars)return;var format=[{x:true,number:true,required:true},{y:true,number:true,required:true}];var errors=series.points.errorbars;if(errors=="x"||errors=="xy"){if(series.points.xerr.asymmetric){format.push({x:true,number:true,required:true});format.push({x:true,number:true,required:true})}else format.push({x:true,number:true,required:true})}if(errors=="y"||errors=="xy"){if(series.points.yerr.asymmetric){format.push({y:true,number:true,required:true});format.push({y:true,number:true,required:true})}else format.push({y:true,number:true,required:true})}datapoints.format=format}function parseErrors(series,i){var points=series.datapoints.points;var exl=null,exu=null,eyl=null,eyu=null;var xerr=series.points.xerr,yerr=series.points.yerr;var eb=series.points.errorbars;if(eb=="x"||eb=="xy"){if(xerr.asymmetric){exl=points[i+2];exu=points[i+3];if(eb=="xy")if(yerr.asymmetric){eyl=points[i+4];eyu=points[i+5]}else eyl=points[i+4]}else{exl=points[i+2];if(eb=="xy")if(yerr.asymmetric){eyl=points[i+3];eyu=points[i+4]}else eyl=points[i+3]}}else if(eb=="y")if(yerr.asymmetric){eyl=points[i+2];eyu=points[i+3]}else eyl=points[i+2];if(exu==null)exu=exl;if(eyu==null)eyu=eyl;var errRanges=[exl,exu,eyl,eyu];if(!xerr.show){errRanges[0]=null;errRanges[1]=null}if(!yerr.show){errRanges[2]=null;errRanges[3]=null}return errRanges}function drawSeriesErrors(plot,ctx,s){var points=s.datapoints.points,ps=s.datapoints.pointsize,ax=[s.xaxis,s.yaxis],radius=s.points.radius,err=[s.points.xerr,s.points.yerr];var invertX=false;if(ax[0].p2c(ax[0].max)<ax[0].p2c(ax[0].min)){invertX=true;var tmp=err[0].lowerCap;err[0].lowerCap=err[0].upperCap;err[0].upperCap=tmp}var invertY=false;if(ax[1].p2c(ax[1].min)<ax[1].p2c(ax[1].max)){invertY=true;var tmp=err[1].lowerCap;err[1].lowerCap=err[1].upperCap;err[1].upperCap=tmp}for(var i=0;i<s.datapoints.points.length;i+=ps){var errRanges=parseErrors(s,i);for(var e=0;e<err.length;e++){var minmax=[ax[e].min,ax[e].max];if(errRanges[e*err.length]){var x=points[i],y=points[i+1];var upper=[x,y][e]+errRanges[e*err.length+1],lower=[x,y][e]-errRanges[e*err.length];if(err[e].err=="x")if(y>ax[1].max||y<ax[1].min||upper<ax[0].min||lower>ax[0].max)continue;if(err[e].err=="y")if(x>ax[0].max||x<ax[0].min||upper<ax[1].min||lower>ax[1].max)continue;var drawUpper=true,drawLower=true;if(upper>minmax[1]){drawUpper=false;upper=minmax[1]}if(lower<minmax[0]){drawLower=false;lower=minmax[0]}if(err[e].err=="x"&&invertX||err[e].err=="y"&&invertY){var tmp=lower;lower=upper;upper=tmp;tmp=drawLower;drawLower=drawUpper;drawUpper=tmp;tmp=minmax[0];minmax[0]=minmax[1];minmax[1]=tmp}x=ax[0].p2c(x),y=ax[1].p2c(y),upper=ax[e].p2c(upper);lower=ax[e].p2c(lower);minmax[0]=ax[e].p2c(minmax[0]);minmax[1]=ax[e].p2c(minmax[1]);var lw=err[e].lineWidth?err[e].lineWidth:s.points.lineWidth,sw=s.points.shadowSize!=null?s.points.shadowSize:s.shadowSize;if(lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w;ctx.strokeStyle="rgba(0,0,0,0.1)";drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,w+w/2,minmax);ctx.strokeStyle="rgba(0,0,0,0.2)";drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,w/2,minmax)}ctx.strokeStyle=err[e].color?err[e].color:s.color;ctx.lineWidth=lw;drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,0,minmax)}}}}function drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,offset,minmax){y+=offset;upper+=offset;lower+=offset;if(err.err=="x"){if(upper>x+radius)drawPath(ctx,[[upper,y],[Math.max(x+radius,minmax[0]),y]]);else drawUpper=false;if(lower<x-radius)drawPath(ctx,[[Math.min(x-radius,minmax[1]),y],[lower,y]]);else drawLower=false}else{if(upper<y-radius)drawPath(ctx,[[x,upper],[x,Math.min(y-radius,minmax[0])]]);else drawUpper=false;if(lower>y+radius)drawPath(ctx,[[x,Math.max(y+radius,minmax[1])],[x,lower]]);else drawLower=false}radius=err.radius!=null?err.radius:radius;if(drawUpper){if(err.upperCap=="-"){if(err.err=="x")drawPath(ctx,[[upper,y-radius],[upper,y+radius]]);else drawPath(ctx,[[x-radius,upper],[x+radius,upper]])}else if($.isFunction(err.upperCap)){if(err.err=="x")err.upperCap(ctx,upper,y,radius);else err.upperCap(ctx,x,upper,radius)}}if(drawLower){if(err.lowerCap=="-"){if(err.err=="x")drawPath(ctx,[[lower,y-radius],[lower,y+radius]]);else drawPath(ctx,[[x-radius,lower],[x+radius,lower]])}else if($.isFunction(err.lowerCap)){if(err.err=="x")err.lowerCap(ctx,lower,y,radius);else err.lowerCap(ctx,x,lower,radius)}}}function drawPath(ctx,pts){ctx.beginPath();ctx.moveTo(pts[0][0],pts[0][1]);for(var p=1;p<pts.length;p++)ctx.lineTo(pts[p][0],pts[p][1]);ctx.stroke()}function draw(plot,ctx){var plotOffset=plot.getPlotOffset();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);$.each(plot.getData(),function(i,s){if(s.points.errorbars&&(s.points.xerr.show||s.points.yerr.show))drawSeriesErrors(plot,ctx,s)});ctx.restore()}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.draw.push(draw)}$.plot.plugins.push({init:init,options:options,name:"errorbars",version:"1.0"})})(jQuery);
|
@@ -1,30 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
The case: you've got two series that you want to fill the area between. In Flot
|
7
|
-
terms, you need to use one as the fill bottom of the other. You can specify the
|
8
|
-
bottom of each data point as the third coordinate manually, or you can use this
|
9
|
-
plugin to compute it for you.
|
10
|
-
|
11
|
-
In order to name the other series, you need to give it an id, like this:
|
12
|
-
|
13
|
-
var dataset = [
|
14
|
-
{ data: [ ... ], id: "foo" } , // use default bottom
|
15
|
-
{ data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom
|
16
|
-
];
|
17
|
-
|
18
|
-
$.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }});
|
19
|
-
|
20
|
-
As a convenience, if the id given is a number that doesn't appear as an id in
|
21
|
-
the series, it is interpreted as the index in the array instead (so fillBetween:
|
22
|
-
0 can also mean the first series).
|
23
|
-
|
24
|
-
Internally, the plugin modifies the datapoints in each series. For line series,
|
25
|
-
extra data points might be inserted through interpolation. Note that at points
|
26
|
-
where the bottom line is not defined (due to a null point or start/end of line),
|
27
|
-
the current line will show a gap too. The algorithm comes from the
|
28
|
-
jquery.flot.stack.js plugin, possibly some code could be shared.
|
29
|
-
|
30
|
-
*/(function(e){function n(e){function t(e,t){var n;for(n=0;n<t.length;++n)if(t[n].id===e.fillBetween)return t[n];return typeof e.fillBetween=="number"?e.fillBetween<0||e.fillBetween>=t.length?null:t[e.fillBetween]:null}function n(e,n,r){if(n.fillBetween==null)return;var i=t(n,e.getData());if(!i)return;var s=r.pointsize,o=r.points,u=i.datapoints.pointsize,a=i.datapoints.points,f=[],l,c,h,p,d,v,m=n.lines.show,g=s>2&&r.format[2].y,y=m&&n.lines.steps,b=!0,w=0,E=0,S,x;for(;;){if(w>=o.length)break;S=f.length;if(o[w]==null){for(x=0;x<s;++x)f.push(o[w+x]);w+=s}else if(E>=a.length){if(!m)for(x=0;x<s;++x)f.push(o[w+x]);w+=s}else if(a[E]==null){for(x=0;x<s;++x)f.push(null);b=!0,E+=u}else{l=o[w],c=o[w+1],p=a[E],d=a[E+1],v=0;if(l===p){for(x=0;x<s;++x)f.push(o[w+x]);v=d,w+=s,E+=u}else if(l>p){if(m&&w>0&&o[w-s]!=null){h=c+(o[w-s+1]-c)*(p-l)/(o[w-s]-l),f.push(p),f.push(h);for(x=2;x<s;++x)f.push(o[w+x]);v=d}E+=u}else{if(b&&m){w+=s;continue}for(x=0;x<s;++x)f.push(o[w+x]);m&&E>0&&a[E-u]!=null&&(v=d+(a[E-u+1]-d)*(l-p)/(a[E-u]-p)),w+=s}b=!1,S!==f.length&&g&&(f[S+2]=v)}if(y&&S!==f.length&&S>0&&f[S]!==null&&f[S]!==f[S-s]&&f[S+1]!==f[S-s+1]){for(x=0;x<s;++x)f[S+s+x]=f[S+x];f[S+1]=f[S-s+1]}}r.points=f}e.hooks.processDatapoints.push(n)}var t={series:{fillBetween:null}};e.plot.plugins.push({init:n,options:t,name:"fillbetween",version:"1.0"})})(jQuery);
|
1
|
+
(function($){var options={series:{fillBetween:null}};function init(plot){function findBottomSeries(s,allseries){var i;for(i=0;i<allseries.length;++i){if(allseries[i].id===s.fillBetween){return allseries[i]}}if(typeof s.fillBetween==="number"){if(s.fillBetween<0||s.fillBetween>=allseries.length){return null}return allseries[s.fillBetween]}return null}function computeFillBottoms(plot,s,datapoints){if(s.fillBetween==null){return}var other=findBottomSeries(s,plot.getData());if(!other){return}var ps=datapoints.pointsize,points=datapoints.points,otherps=other.datapoints.pointsize,otherpoints=other.datapoints.points,newpoints=[],px,py,intery,qx,qy,bottom,withlines=s.lines.show,withbottom=ps>2&&datapoints.format[2].y,withsteps=withlines&&s.lines.steps,fromgap=true,i=0,j=0,l,m;while(true){if(i>=points.length){break}l=newpoints.length;if(points[i]==null){for(m=0;m<ps;++m){newpoints.push(points[i+m])}i+=ps}else if(j>=otherpoints.length){if(!withlines){for(m=0;m<ps;++m){newpoints.push(points[i+m])}}i+=ps}else if(otherpoints[j]==null){for(m=0;m<ps;++m){newpoints.push(null)}fromgap=true;j+=otherps}else{px=points[i];py=points[i+1];qx=otherpoints[j];qy=otherpoints[j+1];bottom=0;if(px===qx){for(m=0;m<ps;++m){newpoints.push(points[i+m])}bottom=qy;i+=ps;j+=otherps}else if(px>qx){if(withlines&&i>0&&points[i-ps]!=null){intery=py+(points[i-ps+1]-py)*(qx-px)/(points[i-ps]-px);newpoints.push(qx);newpoints.push(intery);for(m=2;m<ps;++m){newpoints.push(points[i+m])}bottom=qy}j+=otherps}else{if(fromgap&&withlines){i+=ps;continue}for(m=0;m<ps;++m){newpoints.push(points[i+m])}if(withlines&&j>0&&otherpoints[j-otherps]!=null){bottom=qy+(otherpoints[j-otherps+1]-qy)*(px-qx)/(otherpoints[j-otherps]-qx)}i+=ps}fromgap=false;if(l!==newpoints.length&&withbottom){newpoints[l+2]=bottom}}if(withsteps&&l!==newpoints.length&&l>0&&newpoints[l]!==null&&newpoints[l]!==newpoints[l-ps]&&newpoints[l+1]!==newpoints[l-ps+1]){for(m=0;m<ps;++m){newpoints[l+ps+m]=newpoints[l+m]}newpoints[l+1]=newpoints[l-ps+1]}}datapoints.points=newpoints}plot.hooks.processDatapoints.push(computeFillBottoms)}$.plot.plugins.push({init:init,options:options,name:"fillbetween",version:"1.0"})})(jQuery);
|
@@ -1,53 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
-
Licensed under the MIT license.
|
5
|
-
|
6
|
-
The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and
|
7
|
-
(x2, y2) are where you intend the two opposite corners of the image to end up
|
8
|
-
in the plot. Image must be a fully loaded Javascript image (you can make one
|
9
|
-
with new Image()). If the image is not complete, it's skipped when plotting.
|
10
|
-
|
11
|
-
There are two helpers included for retrieving images. The easiest work the way
|
12
|
-
that you put in URLs instead of images in the data, like this:
|
13
|
-
|
14
|
-
[ "myimage.png", 0, 0, 10, 10 ]
|
15
|
-
|
16
|
-
Then call $.plot.image.loadData( data, options, callback ) where data and
|
17
|
-
options are the same as you pass in to $.plot. This loads the images, replaces
|
18
|
-
the URLs in the data with the corresponding images and calls "callback" when
|
19
|
-
all images are loaded (or failed loading). In the callback, you can then call
|
20
|
-
$.plot with the data set. See the included example.
|
21
|
-
|
22
|
-
A more low-level helper, $.plot.image.load(urls, callback) is also included.
|
23
|
-
Given a list of URLs, it calls callback with an object mapping from URL to
|
24
|
-
Image object when all images are loaded or have failed loading.
|
25
|
-
|
26
|
-
The plugin supports these options:
|
27
|
-
|
28
|
-
series: {
|
29
|
-
images: {
|
30
|
-
show: boolean
|
31
|
-
anchor: "corner" or "center"
|
32
|
-
alpha: [ 0, 1 ]
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
They can be specified for a specific series:
|
37
|
-
|
38
|
-
$.plot( $("#placeholder"), [{
|
39
|
-
data: [ ... ],
|
40
|
-
images: { ... }
|
41
|
-
])
|
42
|
-
|
43
|
-
Note that because the data format is different from usual data points, you
|
44
|
-
can't use images with anything else in a specific data series.
|
45
|
-
|
46
|
-
Setting "anchor" to "center" causes the pixels in the image to be anchored at
|
47
|
-
the corner pixel centers inside of at the pixel corners, effectively letting
|
48
|
-
half a pixel stick out to each side in the plot.
|
49
|
-
|
50
|
-
A possible future direction could be support for tiling for large images (like
|
51
|
-
Google Maps).
|
52
|
-
|
53
|
-
*/(function(e){function n(e,t,n){var r=e.getPlotOffset();if(!n.images||!n.images.show)return;var i=n.datapoints.points,s=n.datapoints.pointsize;for(var o=0;o<i.length;o+=s){var u=i[o],a=i[o+1],f=i[o+2],l=i[o+3],c=i[o+4],h=n.xaxis,p=n.yaxis,d;if(!u||u.width<=0||u.height<=0)continue;a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),n.images.anchor=="center"&&(d=.5*(l-a)/(u.width-1),a-=d,l+=d,d=.5*(c-f)/(u.height-1),f-=d,c+=d);if(a==l||f==c||a>=h.max||l<=h.min||f>=p.max||c<=p.min)continue;var v=0,m=0,g=u.width,y=u.height;a<h.min&&(v+=(g-v)*(h.min-a)/(l-a),a=h.min),l>h.max&&(g+=(g-v)*(h.max-l)/(l-a),l=h.max),f<p.min&&(y+=(m-y)*(p.min-f)/(c-f),f=p.min),c>p.max&&(m+=(m-y)*(p.max-c)/(c-f),c=p.max),a=h.p2c(a),l=h.p2c(l),f=p.p2c(f),c=p.p2c(c),a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),d=t.globalAlpha,t.globalAlpha*=n.images.alpha,t.drawImage(u,v,m,g-v,y-m,a+r.left,f+r.top,l-a,c-f),t.globalAlpha=d}}function r(e,t,n,r){if(!t.images.show)return;r.format=[{required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}]}function i(e){e.hooks.processRawData.push(r),e.hooks.drawSeries.push(n)}var t={series:{images:{show:!1,alpha:1,anchor:"corner"}}};e.plot.image={},e.plot.image.loadDataImages=function(t,n,r){var i=[],s=[],o=n.series.images.show;e.each(t,function(t,n){if(!o&&!n.images.show)return;n.data&&(n=n.data),e.each(n,function(e,t){typeof t[0]=="string"&&(i.push(t[0]),s.push(t))})}),e.plot.image.load(i,function(t){e.each(s,function(e,n){var r=n[0];t[r]&&(n[0]=t[r])}),r()})},e.plot.image.load=function(t,n){var r=t.length,i={};r==0&&n({}),e.each(t,function(t,s){var o=function(){--r,i[s]=this,r==0&&n(i)};e("<img />").load(o).error(o).attr("src",s)})},e.plot.plugins.push({init:i,options:t,name:"image",version:"1.1"})})(jQuery);
|
1
|
+
(function($){var options={series:{images:{show:false,alpha:1,anchor:"corner"}}};$.plot.image={};$.plot.image.loadDataImages=function(series,options,callback){var urls=[],points=[];var defaultShow=options.series.images.show;$.each(series,function(i,s){if(!(defaultShow||s.images.show))return;if(s.data)s=s.data;$.each(s,function(i,p){if(typeof p[0]=="string"){urls.push(p[0]);points.push(p)}})});$.plot.image.load(urls,function(loadedImages){$.each(points,function(i,p){var url=p[0];if(loadedImages[url])p[0]=loadedImages[url]});callback()})};$.plot.image.load=function(urls,callback){var missing=urls.length,loaded={};if(missing==0)callback({});$.each(urls,function(i,url){var handler=function(){--missing;loaded[url]=this;if(missing==0)callback(loaded)};$("<img />").load(handler).error(handler).attr("src",url)})};function drawSeries(plot,ctx,series){var plotOffset=plot.getPlotOffset();if(!series.images||!series.images.show)return;var points=series.datapoints.points,ps=series.datapoints.pointsize;for(var i=0;i<points.length;i+=ps){var img=points[i],x1=points[i+1],y1=points[i+2],x2=points[i+3],y2=points[i+4],xaxis=series.xaxis,yaxis=series.yaxis,tmp;if(!img||img.width<=0||img.height<=0)continue;if(x1>x2){tmp=x2;x2=x1;x1=tmp}if(y1>y2){tmp=y2;y2=y1;y1=tmp}if(series.images.anchor=="center"){tmp=.5*(x2-x1)/(img.width-1);x1-=tmp;x2+=tmp;tmp=.5*(y2-y1)/(img.height-1);y1-=tmp;y2+=tmp}if(x1==x2||y1==y2||x1>=xaxis.max||x2<=xaxis.min||y1>=yaxis.max||y2<=yaxis.min)continue;var sx1=0,sy1=0,sx2=img.width,sy2=img.height;if(x1<xaxis.min){sx1+=(sx2-sx1)*(xaxis.min-x1)/(x2-x1);x1=xaxis.min}if(x2>xaxis.max){sx2+=(sx2-sx1)*(xaxis.max-x2)/(x2-x1);x2=xaxis.max}if(y1<yaxis.min){sy2+=(sy1-sy2)*(yaxis.min-y1)/(y2-y1);y1=yaxis.min}if(y2>yaxis.max){sy1+=(sy1-sy2)*(yaxis.max-y2)/(y2-y1);y2=yaxis.max}x1=xaxis.p2c(x1);x2=xaxis.p2c(x2);y1=yaxis.p2c(y1);y2=yaxis.p2c(y2);if(x1>x2){tmp=x2;x2=x1;x1=tmp}if(y1>y2){tmp=y2;y2=y1;y1=tmp}tmp=ctx.globalAlpha;ctx.globalAlpha*=series.images.alpha;ctx.drawImage(img,sx1,sy1,sx2-sx1,sy2-sy1,x1+plotOffset.left,y1+plotOffset.top,x2-x1,y2-y1);ctx.globalAlpha=tmp}}function processRawData(plot,series,data,datapoints){if(!series.images.show)return;datapoints.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.drawSeries.push(drawSeries)}$.plot.plugins.push({init:init,options:options,name:"image",version:"1.1"})})(jQuery);
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/* Javascript plotting library for jQuery, version 0.8.
|
1
|
+
/* Javascript plotting library for jQuery, version 0.8.2.
|
2
2
|
|
3
3
|
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
4
|
Licensed under the MIT license.
|
@@ -29,7 +29,7 @@ Licensed under the MIT license.
|
|
29
29
|
* V. 1.1: Fix error handling so e.g. parsing an empty string does
|
30
30
|
* produce a color rather than just crashing.
|
31
31
|
*/
|
32
|
-
(function(
|
32
|
+
(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
|
33
33
|
|
34
34
|
// the actual Flot code
|
35
35
|
(function($) {
|
@@ -425,7 +425,7 @@ Licensed under the MIT license.
|
|
425
425
|
element: positions.length ? info.element.clone() : info.element,
|
426
426
|
x: x,
|
427
427
|
y: y
|
428
|
-
}
|
428
|
+
};
|
429
429
|
|
430
430
|
positions.push(position);
|
431
431
|
|
@@ -658,6 +658,23 @@ Licensed under the MIT license.
|
|
658
658
|
};
|
659
659
|
};
|
660
660
|
plot.shutdown = shutdown;
|
661
|
+
plot.destroy = function () {
|
662
|
+
shutdown();
|
663
|
+
placeholder.removeData("plot").empty();
|
664
|
+
|
665
|
+
series = [];
|
666
|
+
options = null;
|
667
|
+
surface = null;
|
668
|
+
overlay = null;
|
669
|
+
eventHolder = null;
|
670
|
+
ctx = null;
|
671
|
+
octx = null;
|
672
|
+
xaxes = [];
|
673
|
+
yaxes = [];
|
674
|
+
hooks = null;
|
675
|
+
highlights = [];
|
676
|
+
plot = null;
|
677
|
+
};
|
661
678
|
plot.resize = function () {
|
662
679
|
var width = placeholder.width(),
|
663
680
|
height = placeholder.height();
|
@@ -735,16 +752,16 @@ Licensed under the MIT license.
|
|
735
752
|
// since the rest of the code assumes that they exist.
|
736
753
|
|
737
754
|
var i, axisOptions, axisCount,
|
755
|
+
fontSize = placeholder.css("font-size"),
|
756
|
+
fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
|
738
757
|
fontDefaults = {
|
739
758
|
style: placeholder.css("font-style"),
|
740
|
-
size: Math.round(0.8 *
|
759
|
+
size: Math.round(0.8 * fontSizeDefault),
|
741
760
|
variant: placeholder.css("font-variant"),
|
742
761
|
weight: placeholder.css("font-weight"),
|
743
762
|
family: placeholder.css("font-family")
|
744
763
|
};
|
745
764
|
|
746
|
-
fontDefaults.lineHeight = fontDefaults.size * 1.15;
|
747
|
-
|
748
765
|
axisCount = options.xaxes.length || 1;
|
749
766
|
for (i = 0; i < axisCount; ++i) {
|
750
767
|
|
@@ -761,6 +778,9 @@ Licensed under the MIT license.
|
|
761
778
|
if (!axisOptions.font.color) {
|
762
779
|
axisOptions.font.color = axisOptions.color;
|
763
780
|
}
|
781
|
+
if (!axisOptions.font.lineHeight) {
|
782
|
+
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
|
783
|
+
}
|
764
784
|
}
|
765
785
|
}
|
766
786
|
|
@@ -780,6 +800,9 @@ Licensed under the MIT license.
|
|
780
800
|
if (!axisOptions.font.color) {
|
781
801
|
axisOptions.font.color = axisOptions.color;
|
782
802
|
}
|
803
|
+
if (!axisOptions.font.lineHeight) {
|
804
|
+
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
|
805
|
+
}
|
783
806
|
}
|
784
807
|
}
|
785
808
|
|
@@ -1131,7 +1154,7 @@ Licensed under the MIT license.
|
|
1131
1154
|
if (val != null) {
|
1132
1155
|
f = format[m];
|
1133
1156
|
// extract min/max info
|
1134
|
-
if (f.autoscale) {
|
1157
|
+
if (f.autoscale !== false) {
|
1135
1158
|
if (f.x) {
|
1136
1159
|
updateAxis(s.xaxis, val, val);
|
1137
1160
|
}
|
@@ -1218,11 +1241,8 @@ Licensed under the MIT license.
|
|
1218
1241
|
case "right":
|
1219
1242
|
delta = -s.bars.barWidth;
|
1220
1243
|
break;
|
1221
|
-
case "center":
|
1222
|
-
delta = -s.bars.barWidth / 2;
|
1223
|
-
break;
|
1224
1244
|
default:
|
1225
|
-
|
1245
|
+
delta = -s.bars.barWidth / 2;
|
1226
1246
|
}
|
1227
1247
|
|
1228
1248
|
if (s.bars.horizontal) {
|
@@ -1253,7 +1273,9 @@ Licensed under the MIT license.
|
|
1253
1273
|
// from a previous plot in this container that we'll try to re-use.
|
1254
1274
|
|
1255
1275
|
placeholder.css("padding", 0) // padding messes up the positioning
|
1256
|
-
.children(
|
1276
|
+
.children().filter(function(){
|
1277
|
+
return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
|
1278
|
+
}).remove();
|
1257
1279
|
|
1258
1280
|
if (placeholder.css("position") == 'static')
|
1259
1281
|
placeholder.css("position", "relative"); // for positioning labels and overlay
|
@@ -1350,7 +1372,7 @@ Licensed under the MIT license.
|
|
1350
1372
|
ticks = axis.ticks || [],
|
1351
1373
|
labelWidth = opts.labelWidth || 0,
|
1352
1374
|
labelHeight = opts.labelHeight || 0,
|
1353
|
-
maxWidth = labelWidth || axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null
|
1375
|
+
maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
|
1354
1376
|
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
|
1355
1377
|
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
|
1356
1378
|
font = opts.font || "flot-tick-label tickLabel";
|
@@ -1382,37 +1404,50 @@ Licensed under the MIT license.
|
|
1382
1404
|
var lw = axis.labelWidth,
|
1383
1405
|
lh = axis.labelHeight,
|
1384
1406
|
pos = axis.options.position,
|
1407
|
+
isXAxis = axis.direction === "x",
|
1385
1408
|
tickLength = axis.options.tickLength,
|
1386
1409
|
axisMargin = options.grid.axisMargin,
|
1387
1410
|
padding = options.grid.labelMargin,
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1411
|
+
innermost = true,
|
1412
|
+
outermost = true,
|
1413
|
+
first = true,
|
1414
|
+
found = false;
|
1415
|
+
|
1416
|
+
// Determine the axis's position in its direction and on its side
|
1417
|
+
|
1418
|
+
$.each(isXAxis ? xaxes : yaxes, function(i, a) {
|
1419
|
+
if (a && a.reserveSpace) {
|
1420
|
+
if (a === axis) {
|
1421
|
+
found = true;
|
1422
|
+
} else if (a.options.position === pos) {
|
1423
|
+
if (found) {
|
1424
|
+
outermost = false;
|
1425
|
+
} else {
|
1426
|
+
innermost = false;
|
1427
|
+
}
|
1428
|
+
}
|
1429
|
+
if (!found) {
|
1430
|
+
first = false;
|
1431
|
+
}
|
1432
|
+
}
|
1394
1433
|
});
|
1395
|
-
if ($.inArray(axis, samePosition) == samePosition.length - 1)
|
1396
|
-
axisMargin = 0; // outermost
|
1397
1434
|
|
1398
|
-
//
|
1399
|
-
if (tickLength == null) {
|
1400
|
-
var sameDirection = $.grep(all, function (a) {
|
1401
|
-
return a && a.reserveSpace;
|
1402
|
-
});
|
1435
|
+
// The outermost axis on each side has no margin
|
1403
1436
|
|
1404
|
-
|
1405
|
-
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1437
|
+
if (outermost) {
|
1438
|
+
axisMargin = 0;
|
1439
|
+
}
|
1440
|
+
|
1441
|
+
// The ticks for the first axis in each direction stretch across
|
1442
|
+
|
1443
|
+
if (tickLength == null) {
|
1444
|
+
tickLength = first ? "full" : 5;
|
1409
1445
|
}
|
1410
1446
|
|
1411
1447
|
if (!isNaN(+tickLength))
|
1412
1448
|
padding += +tickLength;
|
1413
1449
|
|
1414
|
-
|
1415
|
-
if (axis.direction == "x") {
|
1450
|
+
if (isXAxis) {
|
1416
1451
|
lh += padding;
|
1417
1452
|
|
1418
1453
|
if (pos == "bottom") {
|
@@ -1462,7 +1497,7 @@ Licensed under the MIT license.
|
|
1462
1497
|
// inside the canvas and isn't clipped off
|
1463
1498
|
|
1464
1499
|
var minMargin = options.grid.minBorderMargin,
|
1465
|
-
|
1500
|
+
axis, i;
|
1466
1501
|
|
1467
1502
|
// check stuff from the plot (FIXME: this should just read
|
1468
1503
|
// a value from the series, otherwise it's impossible to
|
@@ -1473,21 +1508,37 @@ Licensed under the MIT license.
|
|
1473
1508
|
minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
|
1474
1509
|
}
|
1475
1510
|
|
1476
|
-
|
1511
|
+
var margins = {
|
1512
|
+
left: minMargin,
|
1513
|
+
right: minMargin,
|
1514
|
+
top: minMargin,
|
1515
|
+
bottom: minMargin
|
1516
|
+
};
|
1477
1517
|
|
1478
1518
|
// check axis labels, note we don't check the actual
|
1479
1519
|
// labels but instead use the overall width/height to not
|
1480
1520
|
// jump as much around with replots
|
1481
1521
|
$.each(allAxes(), function (_, axis) {
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1522
|
+
if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
|
1523
|
+
var lastTick = axis.ticks[axis.ticks.length - 1];
|
1524
|
+
if (axis.direction === "x") {
|
1525
|
+
margins.left = Math.max(margins.left, axis.labelWidth / 2);
|
1526
|
+
if (lastTick.v <= axis.max) {
|
1527
|
+
margins.right = Math.max(margins.right, axis.labelWidth / 2);
|
1528
|
+
}
|
1529
|
+
} else {
|
1530
|
+
margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
|
1531
|
+
if (lastTick.v <= axis.max) {
|
1532
|
+
margins.top = Math.max(margins.top, axis.labelHeight / 2);
|
1533
|
+
}
|
1534
|
+
}
|
1535
|
+
}
|
1485
1536
|
});
|
1486
1537
|
|
1487
|
-
plotOffset.left = Math.max(margins.
|
1488
|
-
plotOffset.right = Math.max(margins.
|
1489
|
-
plotOffset.top = Math.max(margins.
|
1490
|
-
plotOffset.bottom = Math.max(margins.
|
1538
|
+
plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
|
1539
|
+
plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
|
1540
|
+
plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
|
1541
|
+
plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
|
1491
1542
|
}
|
1492
1543
|
|
1493
1544
|
function setupGrid() {
|
@@ -2100,17 +2151,21 @@ Licensed under the MIT license.
|
|
2100
2151
|
function drawAxisLabels() {
|
2101
2152
|
|
2102
2153
|
$.each(allAxes(), function (_, axis) {
|
2103
|
-
if (!axis.show || axis.ticks.length == 0)
|
2104
|
-
return;
|
2105
|
-
|
2106
2154
|
var box = axis.box,
|
2107
2155
|
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
|
2108
2156
|
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
|
2109
2157
|
font = axis.options.font || "flot-tick-label tickLabel",
|
2110
2158
|
tick, x, y, halign, valign;
|
2111
2159
|
|
2160
|
+
// Remove text before checking for axis.show and ticks.length;
|
2161
|
+
// otherwise plugins, like flot-tickrotor, that draw their own
|
2162
|
+
// tick labels will end up with both theirs and the defaults.
|
2163
|
+
|
2112
2164
|
surface.removeText(layer);
|
2113
2165
|
|
2166
|
+
if (!axis.show || axis.ticks.length == 0)
|
2167
|
+
return;
|
2168
|
+
|
2114
2169
|
for (var i = 0; i < axis.ticks.length; ++i) {
|
2115
2170
|
|
2116
2171
|
tick = axis.ticks[i];
|
@@ -2468,7 +2523,7 @@ Licensed under the MIT license.
|
|
2468
2523
|
ctx.restore();
|
2469
2524
|
}
|
2470
2525
|
|
2471
|
-
function drawBar(x, y, b, barLeft, barRight,
|
2526
|
+
function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
|
2472
2527
|
var left, right, bottom, top,
|
2473
2528
|
drawLeft, drawRight, drawTop, drawBottom,
|
2474
2529
|
tmp;
|
@@ -2543,13 +2598,8 @@ Licensed under the MIT license.
|
|
2543
2598
|
|
2544
2599
|
// fill the bar
|
2545
2600
|
if (fillStyleCallback) {
|
2546
|
-
c.beginPath();
|
2547
|
-
c.moveTo(left, bottom);
|
2548
|
-
c.lineTo(left, top);
|
2549
|
-
c.lineTo(right, top);
|
2550
|
-
c.lineTo(right, bottom);
|
2551
2601
|
c.fillStyle = fillStyleCallback(bottom, top);
|
2552
|
-
c.
|
2602
|
+
c.fillRect(left, top, right - left, bottom - top)
|
2553
2603
|
}
|
2554
2604
|
|
2555
2605
|
// draw outline
|
@@ -2557,35 +2607,35 @@ Licensed under the MIT license.
|
|
2557
2607
|
c.beginPath();
|
2558
2608
|
|
2559
2609
|
// FIXME: inline moveTo is buggy with excanvas
|
2560
|
-
c.moveTo(left, bottom
|
2610
|
+
c.moveTo(left, bottom);
|
2561
2611
|
if (drawLeft)
|
2562
|
-
c.lineTo(left, top
|
2612
|
+
c.lineTo(left, top);
|
2563
2613
|
else
|
2564
|
-
c.moveTo(left, top
|
2614
|
+
c.moveTo(left, top);
|
2565
2615
|
if (drawTop)
|
2566
|
-
c.lineTo(right, top
|
2616
|
+
c.lineTo(right, top);
|
2567
2617
|
else
|
2568
|
-
c.moveTo(right, top
|
2618
|
+
c.moveTo(right, top);
|
2569
2619
|
if (drawRight)
|
2570
|
-
c.lineTo(right, bottom
|
2620
|
+
c.lineTo(right, bottom);
|
2571
2621
|
else
|
2572
|
-
c.moveTo(right, bottom
|
2622
|
+
c.moveTo(right, bottom);
|
2573
2623
|
if (drawBottom)
|
2574
|
-
c.lineTo(left, bottom
|
2624
|
+
c.lineTo(left, bottom);
|
2575
2625
|
else
|
2576
|
-
c.moveTo(left, bottom
|
2626
|
+
c.moveTo(left, bottom);
|
2577
2627
|
c.stroke();
|
2578
2628
|
}
|
2579
2629
|
}
|
2580
2630
|
|
2581
2631
|
function drawSeriesBars(series) {
|
2582
|
-
function plotBars(datapoints, barLeft, barRight,
|
2632
|
+
function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
|
2583
2633
|
var points = datapoints.points, ps = datapoints.pointsize;
|
2584
2634
|
|
2585
2635
|
for (var i = 0; i < points.length; i += ps) {
|
2586
2636
|
if (points[i] == null)
|
2587
2637
|
continue;
|
2588
|
-
drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight,
|
2638
|
+
drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
|
2589
2639
|
}
|
2590
2640
|
}
|
2591
2641
|
|
@@ -2605,15 +2655,12 @@ Licensed under the MIT license.
|
|
2605
2655
|
case "right":
|
2606
2656
|
barLeft = -series.bars.barWidth;
|
2607
2657
|
break;
|
2608
|
-
case "center":
|
2609
|
-
barLeft = -series.bars.barWidth / 2;
|
2610
|
-
break;
|
2611
2658
|
default:
|
2612
|
-
|
2659
|
+
barLeft = -series.bars.barWidth / 2;
|
2613
2660
|
}
|
2614
2661
|
|
2615
2662
|
var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
|
2616
|
-
plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth,
|
2663
|
+
plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
|
2617
2664
|
ctx.restore();
|
2618
2665
|
}
|
2619
2666
|
|
@@ -2633,10 +2680,15 @@ Licensed under the MIT license.
|
|
2633
2680
|
|
2634
2681
|
function insertLegend() {
|
2635
2682
|
|
2636
|
-
|
2683
|
+
if (options.legend.container != null) {
|
2684
|
+
$(options.legend.container).html("");
|
2685
|
+
} else {
|
2686
|
+
placeholder.find(".legend").remove();
|
2687
|
+
}
|
2637
2688
|
|
2638
|
-
if (!options.legend.show)
|
2689
|
+
if (!options.legend.show) {
|
2639
2690
|
return;
|
2691
|
+
}
|
2640
2692
|
|
2641
2693
|
var fragments = [], entries = [], rowStarted = false,
|
2642
2694
|
lf = options.legend.labelFormatter, s, label;
|
@@ -2797,8 +2849,21 @@ Licensed under the MIT license.
|
|
2797
2849
|
}
|
2798
2850
|
|
2799
2851
|
if (s.bars.show && !item) { // no other point can be nearby
|
2800
|
-
|
2801
|
-
|
2852
|
+
|
2853
|
+
var barLeft, barRight;
|
2854
|
+
|
2855
|
+
switch (s.bars.align) {
|
2856
|
+
case "left":
|
2857
|
+
barLeft = 0;
|
2858
|
+
break;
|
2859
|
+
case "right":
|
2860
|
+
barLeft = -s.bars.barWidth;
|
2861
|
+
break;
|
2862
|
+
default:
|
2863
|
+
barLeft = -s.bars.barWidth / 2;
|
2864
|
+
}
|
2865
|
+
|
2866
|
+
barRight = barLeft + s.bars.barWidth;
|
2802
2867
|
|
2803
2868
|
for (j = 0; j < points.length; j += ps) {
|
2804
2869
|
var x = points[j], y = points[j + 1], b = points[j + 2];
|
@@ -2996,13 +3061,24 @@ Licensed under the MIT license.
|
|
2996
3061
|
function drawBarHighlight(series, point) {
|
2997
3062
|
var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
|
2998
3063
|
fillStyle = highlightColor,
|
2999
|
-
barLeft
|
3064
|
+
barLeft;
|
3065
|
+
|
3066
|
+
switch (series.bars.align) {
|
3067
|
+
case "left":
|
3068
|
+
barLeft = 0;
|
3069
|
+
break;
|
3070
|
+
case "right":
|
3071
|
+
barLeft = -series.bars.barWidth;
|
3072
|
+
break;
|
3073
|
+
default:
|
3074
|
+
barLeft = -series.bars.barWidth / 2;
|
3075
|
+
}
|
3000
3076
|
|
3001
3077
|
octx.lineWidth = series.bars.lineWidth;
|
3002
3078
|
octx.strokeStyle = highlightColor;
|
3003
3079
|
|
3004
3080
|
drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
|
3005
|
-
|
3081
|
+
function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
|
3006
3082
|
}
|
3007
3083
|
|
3008
3084
|
function getColorOrGradient(spec, bottom, top, defaultColor) {
|
@@ -3041,7 +3117,7 @@ Licensed under the MIT license.
|
|
3041
3117
|
return plot;
|
3042
3118
|
};
|
3043
3119
|
|
3044
|
-
$.plot.version = "0.8.
|
3120
|
+
$.plot.version = "0.8.2";
|
3045
3121
|
|
3046
3122
|
$.plot.plugins = [];
|
3047
3123
|
|