flot-rails 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -2
- data/lib/flot/rails/version.rb +2 -2
- data/vendor/assets/javascripts/excanvas.js +1428 -1427
- data/vendor/assets/javascripts/excanvas.min.js +1 -1
- data/vendor/assets/javascripts/jquery.colorhelpers.js +179 -179
- data/vendor/assets/javascripts/jquery.colorhelpers.min.js +21 -1
- data/vendor/assets/javascripts/jquery.flot.canvas.js +317 -0
- data/vendor/assets/javascripts/jquery.flot.canvas.min.js +28 -0
- data/vendor/assets/javascripts/jquery.flot.categories.js +190 -0
- data/vendor/assets/javascripts/jquery.flot.categories.min.js +44 -0
- data/vendor/assets/javascripts/jquery.flot.crosshair.js +176 -167
- data/vendor/assets/javascripts/jquery.flot.crosshair.min.js +59 -1
- data/vendor/assets/javascripts/jquery.flot.errorbars.js +353 -0
- data/vendor/assets/javascripts/jquery.flot.errorbars.min.js +63 -0
- data/vendor/assets/javascripts/jquery.flot.fillbetween.js +226 -183
- data/vendor/assets/javascripts/jquery.flot.fillbetween.min.js +30 -1
- data/vendor/assets/javascripts/jquery.flot.image.js +241 -238
- data/vendor/assets/javascripts/jquery.flot.image.min.js +53 -1
- data/vendor/assets/javascripts/jquery.flot.js +2980 -2599
- data/vendor/assets/javascripts/jquery.flot.min.js +26 -4
- data/vendor/assets/javascripts/jquery.flot.navigate.js +345 -336
- data/vendor/assets/javascripts/jquery.flot.navigate.min.js +96 -1
- data/vendor/assets/javascripts/jquery.flot.pie.js +561 -499
- data/vendor/assets/javascripts/jquery.flot.pie.min.js +56 -1
- data/vendor/assets/javascripts/jquery.flot.resize.js +60 -60
- data/vendor/assets/javascripts/jquery.flot.resize.min.js +21 -1
- data/vendor/assets/javascripts/jquery.flot.selection.js +360 -344
- data/vendor/assets/javascripts/jquery.flot.selection.min.js +79 -1
- data/vendor/assets/javascripts/jquery.flot.stack.js +188 -184
- data/vendor/assets/javascripts/jquery.flot.stack.min.js +36 -1
- data/vendor/assets/javascripts/jquery.flot.symbol.js +71 -70
- data/vendor/assets/javascripts/jquery.flot.symbol.min.js +14 -1
- data/vendor/assets/javascripts/jquery.flot.threshold.js +142 -103
- data/vendor/assets/javascripts/jquery.flot.threshold.min.js +43 -1
- data/vendor/assets/javascripts/jquery.flot.time.js +424 -0
- data/vendor/assets/javascripts/jquery.flot.time.min.js +9 -0
- metadata +25 -7
@@ -1 +1,79 @@
|
|
1
|
-
|
1
|
+
/* Flot plugin for selecting regions of a plot.
|
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
|
+
selection: {
|
9
|
+
mode: null or "x" or "y" or "xy",
|
10
|
+
color: color,
|
11
|
+
shape: "round" or "miter" or "bevel",
|
12
|
+
minSize: number of pixels
|
13
|
+
}
|
14
|
+
|
15
|
+
Selection support is enabled by setting the mode to one of "x", "y" or "xy".
|
16
|
+
In "x" mode, the user will only be able to specify the x range, similarly for
|
17
|
+
"y" mode. For "xy", the selection becomes a rectangle where both ranges can be
|
18
|
+
specified. "color" is color of the selection (if you need to change the color
|
19
|
+
later on, you can get to it with plot.getOptions().selection.color). "shape"
|
20
|
+
is the shape of the corners of the selection.
|
21
|
+
|
22
|
+
"minSize" is the minimum size a selection can be in pixels. This value can
|
23
|
+
be customized to determine the smallest size a selection can be and still
|
24
|
+
have the selection rectangle be displayed. When customizing this value, the
|
25
|
+
fact that it refers to pixels, not axis units must be taken into account.
|
26
|
+
Thus, for example, if there is a bar graph in time mode with BarWidth set to 1
|
27
|
+
minute, setting "minSize" to 1 will not make the minimum selection size 1
|
28
|
+
minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent
|
29
|
+
"plotunselected" events from being fired when the user clicks the mouse without
|
30
|
+
dragging.
|
31
|
+
|
32
|
+
When selection support is enabled, a "plotselected" event will be emitted on
|
33
|
+
the DOM element you passed into the plot function. The event handler gets a
|
34
|
+
parameter with the ranges selected on the axes, like this:
|
35
|
+
|
36
|
+
placeholder.bind( "plotselected", function( event, ranges ) {
|
37
|
+
alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to)
|
38
|
+
// similar for yaxis - with multiple axes, the extra ones are in
|
39
|
+
// x2axis, x3axis, ...
|
40
|
+
});
|
41
|
+
|
42
|
+
The "plotselected" event is only fired when the user has finished making the
|
43
|
+
selection. A "plotselecting" event is fired during the process with the same
|
44
|
+
parameters as the "plotselected" event, in case you want to know what's
|
45
|
+
happening while it's happening,
|
46
|
+
|
47
|
+
A "plotunselected" event with no arguments is emitted when the user clicks the
|
48
|
+
mouse to remove the selection. As stated above, setting "minSize" to 0 will
|
49
|
+
destroy this behavior.
|
50
|
+
|
51
|
+
The plugin allso adds the following methods to the plot object:
|
52
|
+
|
53
|
+
- setSelection( ranges, preventEvent )
|
54
|
+
|
55
|
+
Set the selection rectangle. The passed in ranges is on the same form as
|
56
|
+
returned in the "plotselected" event. If the selection mode is "x", you
|
57
|
+
should put in either an xaxis range, if the mode is "y" you need to put in
|
58
|
+
an yaxis range and both xaxis and yaxis if the selection mode is "xy", like
|
59
|
+
this:
|
60
|
+
|
61
|
+
setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });
|
62
|
+
|
63
|
+
setSelection will trigger the "plotselected" event when called. If you don't
|
64
|
+
want that to happen, e.g. if you're inside a "plotselected" handler, pass
|
65
|
+
true as the second parameter. If you are using multiple axes, you can
|
66
|
+
specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of
|
67
|
+
xaxis, the plugin picks the first one it sees.
|
68
|
+
|
69
|
+
- clearSelection( preventEvent )
|
70
|
+
|
71
|
+
Clear the selection rectangle. Pass in true to avoid getting a
|
72
|
+
"plotunselected" event.
|
73
|
+
|
74
|
+
- getSelection()
|
75
|
+
|
76
|
+
Returns the current selection in the same format as the "plotselected"
|
77
|
+
event. If there's currently no selection, the function returns null.
|
78
|
+
|
79
|
+
*/(function(e){function t(t){function s(e){n.active&&(h(e),t.getPlaceholder().trigger("plotselecting",[a()]))}function o(t){if(t.which!=1)return;document.body.focus(),document.onselectstart!==undefined&&r.onselectstart==null&&(r.onselectstart=document.onselectstart,document.onselectstart=function(){return!1}),document.ondrag!==undefined&&r.ondrag==null&&(r.ondrag=document.ondrag,document.ondrag=function(){return!1}),c(n.first,t),n.active=!0,i=function(e){u(e)},e(document).one("mouseup",i)}function u(e){return i=null,document.onselectstart!==undefined&&(document.onselectstart=r.onselectstart),document.ondrag!==undefined&&(document.ondrag=r.ondrag),n.active=!1,h(e),m()?f():(t.getPlaceholder().trigger("plotunselected",[]),t.getPlaceholder().trigger("plotselecting",[null])),!1}function a(){if(!m())return null;if(!n.show)return null;var r={},i=n.first,s=n.second;return e.each(t.getAxes(),function(e,t){if(t.used){var n=t.c2p(i[t.direction]),o=t.c2p(s[t.direction]);r[e]={from:Math.min(n,o),to:Math.max(n,o)}}}),r}function f(){var e=a();t.getPlaceholder().trigger("plotselected",[e]),e.xaxis&&e.yaxis&&t.getPlaceholder().trigger("selected",[{x1:e.xaxis.from,y1:e.yaxis.from,x2:e.xaxis.to,y2:e.yaxis.to}])}function l(e,t,n){return t<e?e:t>n?n:t}function c(e,r){var i=t.getOptions(),s=t.getPlaceholder().offset(),o=t.getPlotOffset();e.x=l(0,r.pageX-s.left-o.left,t.width()),e.y=l(0,r.pageY-s.top-o.top,t.height()),i.selection.mode=="y"&&(e.x=e==n.first?0:t.width()),i.selection.mode=="x"&&(e.y=e==n.first?0:t.height())}function h(e){if(e.pageX==null)return;c(n.second,e),m()?(n.show=!0,t.triggerRedrawOverlay()):p(!0)}function p(e){n.show&&(n.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,n){var r,i,s,o,u=t.getAxes();for(var a in u){r=u[a];if(r.direction==n){o=n+r.n+"axis",!e[o]&&r.n==1&&(o=n+"axis");if(e[o]){i=e[o].from,s=e[o].to;break}}}e[o]||(r=n=="x"?t.getXAxes()[0]:t.getYAxes()[0],i=e[n+"1"],s=e[n+"2"]);if(i!=null&&s!=null&&i>s){var f=i;i=s,s=f}return{from:i,to:s,axis:r}}function v(e,r){var i,s,o=t.getOptions();o.selection.mode=="y"?(n.first.x=0,n.second.x=t.width()):(s=d(e,"x"),n.first.x=s.axis.p2c(s.from),n.second.x=s.axis.p2c(s.to)),o.selection.mode=="x"?(n.first.y=0,n.second.y=t.height()):(s=d(e,"y"),n.first.y=s.axis.p2c(s.from),n.second.y=s.axis.p2c(s.to)),n.show=!0,t.triggerRedrawOverlay(),!r&&m()&&f()}function m(){var e=t.getOptions().selection.minSize;return Math.abs(n.second.x-n.first.x)>=e&&Math.abs(n.second.y-n.first.y)>=e}var n={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},r={},i=null;t.clearSelection=p,t.setSelection=v,t.getSelection=a,t.hooks.bindEvents.push(function(e,t){var n=e.getOptions();n.selection.mode!=null&&(t.mousemove(s),t.mousedown(o))}),t.hooks.drawOverlay.push(function(t,r){if(n.show&&m()){var i=t.getPlotOffset(),s=t.getOptions();r.save(),r.translate(i.left,i.top);var o=e.color.parse(s.selection.color);r.strokeStyle=o.scale("a",.8).toString(),r.lineWidth=1,r.lineJoin=s.selection.shape,r.fillStyle=o.scale("a",.4).toString();var u=Math.min(n.first.x,n.second.x)+.5,a=Math.min(n.first.y,n.second.y)+.5,f=Math.abs(n.second.x-n.first.x)-1,l=Math.abs(n.second.y-n.first.y)-1;r.fillRect(u,a,f,l),r.strokeRect(u,a,f,l),r.restore()}}),t.hooks.shutdown.push(function(t,n){n.unbind("mousemove",s),n.unbind("mousedown",o),i&&e(document).unbind("mouseup",i)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery);
|
@@ -1,184 +1,188 @@
|
|
1
|
-
/*
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
the
|
9
|
-
behaviour. This also holds for the start
|
10
|
-
that stacking a mix of positive and negative values
|
11
|
-
doesn't make sense (so it looks weird).
|
12
|
-
|
13
|
-
Two or more series are stacked when their "stack" attribute is set to
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
if (
|
59
|
-
return;
|
60
|
-
|
61
|
-
var
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
newpoints[l
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
1
|
+
/* Flot plugin for stacking data sets rather than overlyaing them.
|
2
|
+
|
3
|
+
Copyright (c) 2007-2013 IOLA and Ole Laursen.
|
4
|
+
Licensed under the MIT license.
|
5
|
+
|
6
|
+
The plugin assumes the data is sorted on x (or y if stacking horizontally).
|
7
|
+
For line charts, it is assumed that if a line has an undefined gap (from a
|
8
|
+
null point), then the line above it should have the same gap - insert zeros
|
9
|
+
instead of "null" if you want another behaviour. This also holds for the start
|
10
|
+
and end of the chart. Note that stacking a mix of positive and negative values
|
11
|
+
in most instances doesn't make sense (so it looks weird).
|
12
|
+
|
13
|
+
Two or more series are stacked when their "stack" attribute is set to the same
|
14
|
+
key (which can be any number or string or just "true"). To specify the default
|
15
|
+
stack, you can set the stack option like this:
|
16
|
+
|
17
|
+
series: {
|
18
|
+
stack: null/false, true, or a key (number/string)
|
19
|
+
}
|
20
|
+
|
21
|
+
You can also specify it for a single series, like this:
|
22
|
+
|
23
|
+
$.plot( $("#placeholder"), [{
|
24
|
+
data: [ ... ],
|
25
|
+
stack: true
|
26
|
+
}])
|
27
|
+
|
28
|
+
The stacking order is determined by the order of the data series in the array
|
29
|
+
(later series end up on top of the previous).
|
30
|
+
|
31
|
+
Internally, the plugin modifies the datapoints in each series, adding an
|
32
|
+
offset to the y value. For line series, extra data points are inserted through
|
33
|
+
interpolation. If there's a second y value, it's also adjusted (e.g for bar
|
34
|
+
charts or filled areas).
|
35
|
+
|
36
|
+
*/
|
37
|
+
|
38
|
+
(function ($) {
|
39
|
+
var options = {
|
40
|
+
series: { stack: null } // or number/string
|
41
|
+
};
|
42
|
+
|
43
|
+
function init(plot) {
|
44
|
+
function findMatchingSeries(s, allseries) {
|
45
|
+
var res = null;
|
46
|
+
for (var i = 0; i < allseries.length; ++i) {
|
47
|
+
if (s == allseries[i])
|
48
|
+
break;
|
49
|
+
|
50
|
+
if (allseries[i].stack == s.stack)
|
51
|
+
res = allseries[i];
|
52
|
+
}
|
53
|
+
|
54
|
+
return res;
|
55
|
+
}
|
56
|
+
|
57
|
+
function stackData(plot, s, datapoints) {
|
58
|
+
if (s.stack == null || s.stack === false)
|
59
|
+
return;
|
60
|
+
|
61
|
+
var other = findMatchingSeries(s, plot.getData());
|
62
|
+
if (!other)
|
63
|
+
return;
|
64
|
+
|
65
|
+
var ps = datapoints.pointsize,
|
66
|
+
points = datapoints.points,
|
67
|
+
otherps = other.datapoints.pointsize,
|
68
|
+
otherpoints = other.datapoints.points,
|
69
|
+
newpoints = [],
|
70
|
+
px, py, intery, qx, qy, bottom,
|
71
|
+
withlines = s.lines.show,
|
72
|
+
horizontal = s.bars.horizontal,
|
73
|
+
withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),
|
74
|
+
withsteps = withlines && s.lines.steps,
|
75
|
+
fromgap = true,
|
76
|
+
keyOffset = horizontal ? 1 : 0,
|
77
|
+
accumulateOffset = horizontal ? 0 : 1,
|
78
|
+
i = 0, j = 0, l, m;
|
79
|
+
|
80
|
+
while (true) {
|
81
|
+
if (i >= points.length)
|
82
|
+
break;
|
83
|
+
|
84
|
+
l = newpoints.length;
|
85
|
+
|
86
|
+
if (points[i] == null) {
|
87
|
+
// copy gaps
|
88
|
+
for (m = 0; m < ps; ++m)
|
89
|
+
newpoints.push(points[i + m]);
|
90
|
+
i += ps;
|
91
|
+
}
|
92
|
+
else if (j >= otherpoints.length) {
|
93
|
+
// for lines, we can't use the rest of the points
|
94
|
+
if (!withlines) {
|
95
|
+
for (m = 0; m < ps; ++m)
|
96
|
+
newpoints.push(points[i + m]);
|
97
|
+
}
|
98
|
+
i += ps;
|
99
|
+
}
|
100
|
+
else if (otherpoints[j] == null) {
|
101
|
+
// oops, got a gap
|
102
|
+
for (m = 0; m < ps; ++m)
|
103
|
+
newpoints.push(null);
|
104
|
+
fromgap = true;
|
105
|
+
j += otherps;
|
106
|
+
}
|
107
|
+
else {
|
108
|
+
// cases where we actually got two points
|
109
|
+
px = points[i + keyOffset];
|
110
|
+
py = points[i + accumulateOffset];
|
111
|
+
qx = otherpoints[j + keyOffset];
|
112
|
+
qy = otherpoints[j + accumulateOffset];
|
113
|
+
bottom = 0;
|
114
|
+
|
115
|
+
if (px == qx) {
|
116
|
+
for (m = 0; m < ps; ++m)
|
117
|
+
newpoints.push(points[i + m]);
|
118
|
+
|
119
|
+
newpoints[l + accumulateOffset] += qy;
|
120
|
+
bottom = qy;
|
121
|
+
|
122
|
+
i += ps;
|
123
|
+
j += otherps;
|
124
|
+
}
|
125
|
+
else if (px > qx) {
|
126
|
+
// we got past point below, might need to
|
127
|
+
// insert interpolated extra point
|
128
|
+
if (withlines && i > 0 && points[i - ps] != null) {
|
129
|
+
intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px);
|
130
|
+
newpoints.push(qx);
|
131
|
+
newpoints.push(intery + qy);
|
132
|
+
for (m = 2; m < ps; ++m)
|
133
|
+
newpoints.push(points[i + m]);
|
134
|
+
bottom = qy;
|
135
|
+
}
|
136
|
+
|
137
|
+
j += otherps;
|
138
|
+
}
|
139
|
+
else { // px < qx
|
140
|
+
if (fromgap && withlines) {
|
141
|
+
// if we come from a gap, we just skip this point
|
142
|
+
i += ps;
|
143
|
+
continue;
|
144
|
+
}
|
145
|
+
|
146
|
+
for (m = 0; m < ps; ++m)
|
147
|
+
newpoints.push(points[i + m]);
|
148
|
+
|
149
|
+
// we might be able to interpolate a point below,
|
150
|
+
// this can give us a better y
|
151
|
+
if (withlines && j > 0 && otherpoints[j - otherps] != null)
|
152
|
+
bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx);
|
153
|
+
|
154
|
+
newpoints[l + accumulateOffset] += bottom;
|
155
|
+
|
156
|
+
i += ps;
|
157
|
+
}
|
158
|
+
|
159
|
+
fromgap = false;
|
160
|
+
|
161
|
+
if (l != newpoints.length && withbottom)
|
162
|
+
newpoints[l + 2] += bottom;
|
163
|
+
}
|
164
|
+
|
165
|
+
// maintain the line steps invariant
|
166
|
+
if (withsteps && l != newpoints.length && l > 0
|
167
|
+
&& newpoints[l] != null
|
168
|
+
&& newpoints[l] != newpoints[l - ps]
|
169
|
+
&& newpoints[l + 1] != newpoints[l - ps + 1]) {
|
170
|
+
for (m = 0; m < ps; ++m)
|
171
|
+
newpoints[l + ps + m] = newpoints[l + m];
|
172
|
+
newpoints[l + 1] = newpoints[l - ps + 1];
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
datapoints.points = newpoints;
|
177
|
+
}
|
178
|
+
|
179
|
+
plot.hooks.processDatapoints.push(stackData);
|
180
|
+
}
|
181
|
+
|
182
|
+
$.plot.plugins.push({
|
183
|
+
init: init,
|
184
|
+
options: options,
|
185
|
+
name: 'stack',
|
186
|
+
version: '1.2'
|
187
|
+
});
|
188
|
+
})(jQuery);
|