Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
C
CurvedLines
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
HS-public
CurvedLines
Commits
d1dc90e8
Commit
d1dc90e8
authored
May 24, 2014
by
MichaelZinsmaier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added descriptive example for fitPointDist and curvePointFactor parameter based on issue18
parent
bab6fd13
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
510 additions
and
5 deletions
+510
-5
curvedLines.js
curvedLines.js
+4
-5
jquery.flot.navigate.js
flot/jquery.flot.navigate.js
+346
-0
Issue18.htm
tests/Issue18.htm
+160
-0
No files found.
curvedLines.js
View file @
d1dc90e8
...
@@ -63,10 +63,9 @@
...
@@ -63,10 +63,9 @@
apply: bool true => series will be drawn as curved line
apply: bool true => series will be drawn as curved line
fit: bool true => forces the max,mins of the curve to be on the datapoints
fit: bool true => forces the max,mins of the curve to be on the datapoints
curvePointFactor int defines how many "virtual" points are used per "real" data point to
curvePointFactor int defines how many "virtual" points are used per "real" data point to
emulate the curvedLines
emulate the curvedLines
(points total = real points * curvePointFactor)
fitPointDist: int defines the x axis distance of the additional two points that are used
fitPointDist: int defines the x axis distance of the additional two points that are used
to enforce the min max condition. (you will get curvePointFactor * 3 * |datapoints|
to enforce the min max condition.
"virtual" points if fit is true)
+ line options (since v0.5 curved lines use flots line implementation for drawing
+ line options (since v0.5 curved lines use flots line implementation for drawing
=> line options like fill, show ... are supported out of the box)
=> line options like fill, show ... are supported out of the box)
...
@@ -195,8 +194,7 @@
...
@@ -195,8 +194,7 @@
if
(
curvedLinesOptions
.
fit
)
{
if
(
curvedLinesOptions
.
fit
)
{
//insert a point before and after the "real" data point to force the line
//insert a point before and after the "real" data point to force the line
//to have a max,min at the data point however only if it is a lowest or highest point of the
//to have a max,min at the data point.
//curve => avoid saddles
var
fpDist
;
var
fpDist
;
if
(
typeof
curvedLinesOptions
.
fitPointDist
==
'undefined'
)
{
if
(
typeof
curvedLinesOptions
.
fitPointDist
==
'undefined'
)
{
...
@@ -279,6 +277,7 @@
...
@@ -279,6 +277,7 @@
y2
[
j
]
=
y2
[
j
]
*
y2
[
j
+
1
]
+
delta
[
j
];
y2
[
j
]
=
y2
[
j
]
*
y2
[
j
+
1
]
+
delta
[
j
];
}
}
// xmax - xmin / #points
var
step
=
(
xdata
[
n
-
1
]
-
xdata
[
0
])
/
(
num
-
1
);
var
step
=
(
xdata
[
n
-
1
]
-
xdata
[
0
])
/
(
num
-
1
);
var
xnew
=
new
Array
;
var
xnew
=
new
Array
;
...
...
flot/jquery.flot.navigate.js
0 → 100644
View file @
d1dc90e8
/* Flot plugin for adding the ability to pan and zoom the plot.
Copyright (c) 2007-2014 IOLA and Ole Laursen.
Licensed under the MIT license.
The default behaviour is double click and scrollwheel up/down to zoom in, drag
to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and
plot.pan( offset ) so you easily can add custom controls. It also fires
"plotpan" and "plotzoom" events, useful for synchronizing plots.
The plugin supports these options:
zoom: {
interactive: false
trigger: "dblclick" // or "click" for single click
amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out)
}
pan: {
interactive: false
cursor: "move" // CSS mouse cursor value used when dragging, e.g. "pointer"
frameRate: 20
}
xaxis, yaxis, x2axis, y2axis: {
zoomRange: null // or [ number, number ] (min range, max range) or false
panRange: null // or [ number, number ] (min, max) or false
}
"interactive" enables the built-in drag/click behaviour. If you enable
interactive for pan, then you'll have a basic plot that supports moving
around; the same for zoom.
"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to
the current viewport.
"cursor" is a standard CSS mouse cursor string used for visual feedback to the
user when dragging.
"frameRate" specifies the maximum number of times per second the plot will
update itself while the user is panning around on it (set to null to disable
intermediate pans, the plot will then not update until the mouse button is
released).
"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange:
[1, 100] the zoom will never scale the axis so that the difference between min
and max is smaller than 1 or larger than 100. You can set either end to null
to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis
will be disabled.
"panRange" confines the panning to stay within a range, e.g. with panRange:
[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can
be null, e.g. [-10, null]. If you set panRange to false, panning on that axis
will be disabled.
Example API usage:
plot = $.plot(...);
// zoom default amount in on the pixel ( 10, 20 )
plot.zoom({ center: { left: 10, top: 20 } });
// zoom out again
plot.zoomOut({ center: { left: 10, top: 20 } });
// zoom 200% in on the pixel (10, 20)
plot.zoom({ amount: 2, center: { left: 10, top: 20 } });
// pan 100 pixels to the left and 20 down
plot.pan({ left: -100, top: 20 })
Here, "center" specifies where the center of the zooming should happen. Note
that this is defined in pixel space, not the space of the data points (you can
use the p2c helpers on the axes in Flot to help you convert between these).
"amount" is the amount to zoom the viewport relative to the current range, so
1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You
can set the default in the options.
*/
// First two dependencies, jquery.event.drag.js and
// jquery.mousewheel.js, we put them inline here to save people the
// effort of downloading them.
/*
jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
*/
(
function
(
a
){
function
e
(
h
){
var
k
,
j
=
this
,
l
=
h
.
data
||
{};
if
(
l
.
elem
)
j
=
h
.
dragTarget
=
l
.
elem
,
h
.
dragProxy
=
d
.
proxy
||
j
,
h
.
cursorOffsetX
=
l
.
pageX
-
l
.
left
,
h
.
cursorOffsetY
=
l
.
pageY
-
l
.
top
,
h
.
offsetX
=
h
.
pageX
-
h
.
cursorOffsetX
,
h
.
offsetY
=
h
.
pageY
-
h
.
cursorOffsetY
;
else
if
(
d
.
dragging
||
l
.
which
>
0
&&
h
.
which
!=
l
.
which
||
a
(
h
.
target
).
is
(
l
.
not
))
return
;
switch
(
h
.
type
){
case
"mousedown"
:
return
a
.
extend
(
l
,
a
(
j
).
offset
(),{
elem
:
j
,
target
:
h
.
target
,
pageX
:
h
.
pageX
,
pageY
:
h
.
pageY
}),
b
.
add
(
document
,
"mousemove mouseup"
,
e
,
l
),
i
(
j
,
!
1
),
d
.
dragging
=
null
,
!
1
;
case
!
d
.
dragging
&&
"mousemove"
:
if
(
g
(
h
.
pageX
-
l
.
pageX
)
+
g
(
h
.
pageY
-
l
.
pageY
)
<
l
.
distance
)
break
;
h
.
target
=
l
.
target
,
k
=
f
(
h
,
"dragstart"
,
j
),
k
!==!
1
&&
(
d
.
dragging
=
j
,
d
.
proxy
=
h
.
dragProxy
=
a
(
k
||
j
)[
0
]);
case
"mousemove"
:
if
(
d
.
dragging
){
if
(
k
=
f
(
h
,
"drag"
,
j
),
c
.
drop
&&
(
c
.
drop
.
allowed
=
k
!==!
1
,
c
.
drop
.
handler
(
h
)),
k
!==!
1
)
break
;
h
.
type
=
"mouseup"
}
case
"mouseup"
:
b
.
remove
(
document
,
"mousemove mouseup"
,
e
),
d
.
dragging
&&
(
c
.
drop
&&
c
.
drop
.
handler
(
h
),
f
(
h
,
"dragend"
,
j
)),
i
(
j
,
!
0
),
d
.
dragging
=
d
.
proxy
=
l
.
elem
=!
1
}
return
!
0
}
function
f
(
b
,
c
,
d
){
b
.
type
=
c
;
var
e
=
a
.
event
.
dispatch
.
call
(
d
,
b
);
return
e
===!
1
?
!
1
:
e
||
b
.
result
}
function
g
(
a
){
return
Math
.
pow
(
a
,
2
)}
function
h
(){
return
d
.
dragging
===!
1
}
function
i
(
a
,
b
){
a
&&
(
a
.
unselectable
=
b
?
"off"
:
"on"
,
a
.
onselectstart
=
function
(){
return
b
},
a
.
style
&&
(
a
.
style
.
MozUserSelect
=
b
?
""
:
"none"
))}
a
.
fn
.
drag
=
function
(
a
,
b
,
c
){
return
b
&&
this
.
bind
(
"dragstart"
,
a
),
c
&&
this
.
bind
(
"dragend"
,
c
),
a
?
this
.
bind
(
"drag"
,
b
?
b
:
a
):
this
.
trigger
(
"drag"
)};
var
b
=
a
.
event
,
c
=
b
.
special
,
d
=
c
.
drag
=
{
not
:
":input"
,
distance
:
0
,
which
:
1
,
dragging
:
!
1
,
setup
:
function
(
c
){
c
=
a
.
extend
({
distance
:
d
.
distance
,
which
:
d
.
which
,
not
:
d
.
not
},
c
||
{}),
c
.
distance
=
g
(
c
.
distance
),
b
.
add
(
this
,
"mousedown"
,
e
,
c
),
this
.
attachEvent
&&
this
.
attachEvent
(
"ondragstart"
,
h
)},
teardown
:
function
(){
b
.
remove
(
this
,
"mousedown"
,
e
),
this
===
d
.
dragging
&&
(
d
.
dragging
=
d
.
proxy
=!
1
),
i
(
this
,
!
0
),
this
.
detachEvent
&&
this
.
detachEvent
(
"ondragstart"
,
h
)}};
c
.
dragstart
=
c
.
dragend
=
{
setup
:
function
(){},
teardown
:
function
(){}}})(
jQuery
);
/* jquery.mousewheel.min.js
* Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
* Licensed under the MIT License (LICENSE.txt).
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
* Thanks to: Seamus Leahy for adding deltaX and deltaY
*
* Version: 3.0.6
*
* Requires: 1.2.2+
*/
(
function
(
d
){
function
e
(
a
){
var
b
=
a
||
window
.
event
,
c
=
[].
slice
.
call
(
arguments
,
1
),
f
=
0
,
e
=
0
,
g
=
0
,
a
=
d
.
event
.
fix
(
b
);
a
.
type
=
"mousewheel"
;
b
.
wheelDelta
&&
(
f
=
b
.
wheelDelta
/
120
);
b
.
detail
&&
(
f
=-
b
.
detail
/
3
);
g
=
f
;
void
0
!==
b
.
axis
&&
b
.
axis
===
b
.
HORIZONTAL_AXIS
&&
(
g
=
0
,
e
=-
1
*
f
);
void
0
!==
b
.
wheelDeltaY
&&
(
g
=
b
.
wheelDeltaY
/
120
);
void
0
!==
b
.
wheelDeltaX
&&
(
e
=-
1
*
b
.
wheelDeltaX
/
120
);
c
.
unshift
(
a
,
f
,
e
,
g
);
return
(
d
.
event
.
dispatch
||
d
.
event
.
handle
).
apply
(
this
,
c
)}
var
c
=
[
"DOMMouseScroll"
,
"mousewheel"
];
if
(
d
.
event
.
fixHooks
)
for
(
var
h
=
c
.
length
;
h
;)
d
.
event
.
fixHooks
[
c
[
--
h
]]
=
d
.
event
.
mouseHooks
;
d
.
event
.
special
.
mousewheel
=
{
setup
:
function
(){
if
(
this
.
addEventListener
)
for
(
var
a
=
c
.
length
;
a
;)
this
.
addEventListener
(
c
[
--
a
],
e
,
!
1
);
else
this
.
onmousewheel
=
e
},
teardown
:
function
(){
if
(
this
.
removeEventListener
)
for
(
var
a
=
c
.
length
;
a
;)
this
.
removeEventListener
(
c
[
--
a
],
e
,
!
1
);
else
this
.
onmousewheel
=
null
}};
d
.
fn
.
extend
({
mousewheel
:
function
(
a
){
return
a
?
this
.
bind
(
"mousewheel"
,
a
):
this
.
trigger
(
"mousewheel"
)},
unmousewheel
:
function
(
a
){
return
this
.
unbind
(
"mousewheel"
,
a
)}})})(
jQuery
);
(
function
(
$
)
{
var
options
=
{
xaxis
:
{
zoomRange
:
null
,
// or [number, number] (min range, max range)
panRange
:
null
// or [number, number] (min, max)
},
zoom
:
{
interactive
:
false
,
trigger
:
"dblclick"
,
// or "click" for single click
amount
:
1.5
// how much to zoom relative to current position, 2 = 200% (zoom in), 0.5 = 50% (zoom out)
},
pan
:
{
interactive
:
false
,
cursor
:
"move"
,
frameRate
:
20
}
};
function
init
(
plot
)
{
function
onZoomClick
(
e
,
zoomOut
)
{
var
c
=
plot
.
offset
();
c
.
left
=
e
.
pageX
-
c
.
left
;
c
.
top
=
e
.
pageY
-
c
.
top
;
if
(
zoomOut
)
plot
.
zoomOut
({
center
:
c
});
else
plot
.
zoom
({
center
:
c
});
}
function
onMouseWheel
(
e
,
delta
)
{
e
.
preventDefault
();
onZoomClick
(
e
,
delta
<
0
);
return
false
;
}
var
prevCursor
=
'default'
,
prevPageX
=
0
,
prevPageY
=
0
,
panTimeout
=
null
;
function
onDragStart
(
e
)
{
if
(
e
.
which
!=
1
)
// only accept left-click
return
false
;
var
c
=
plot
.
getPlaceholder
().
css
(
'cursor'
);
if
(
c
)
prevCursor
=
c
;
plot
.
getPlaceholder
().
css
(
'cursor'
,
plot
.
getOptions
().
pan
.
cursor
);
prevPageX
=
e
.
pageX
;
prevPageY
=
e
.
pageY
;
}
function
onDrag
(
e
)
{
var
frameRate
=
plot
.
getOptions
().
pan
.
frameRate
;
if
(
panTimeout
||
!
frameRate
)
return
;
panTimeout
=
setTimeout
(
function
()
{
plot
.
pan
({
left
:
prevPageX
-
e
.
pageX
,
top
:
prevPageY
-
e
.
pageY
});
prevPageX
=
e
.
pageX
;
prevPageY
=
e
.
pageY
;
panTimeout
=
null
;
},
1
/
frameRate
*
1000
);
}
function
onDragEnd
(
e
)
{
if
(
panTimeout
)
{
clearTimeout
(
panTimeout
);
panTimeout
=
null
;
}
plot
.
getPlaceholder
().
css
(
'cursor'
,
prevCursor
);
plot
.
pan
({
left
:
prevPageX
-
e
.
pageX
,
top
:
prevPageY
-
e
.
pageY
});
}
function
bindEvents
(
plot
,
eventHolder
)
{
var
o
=
plot
.
getOptions
();
if
(
o
.
zoom
.
interactive
)
{
eventHolder
[
o
.
zoom
.
trigger
](
onZoomClick
);
eventHolder
.
mousewheel
(
onMouseWheel
);
}
if
(
o
.
pan
.
interactive
)
{
eventHolder
.
bind
(
"dragstart"
,
{
distance
:
10
},
onDragStart
);
eventHolder
.
bind
(
"drag"
,
onDrag
);
eventHolder
.
bind
(
"dragend"
,
onDragEnd
);
}
}
plot
.
zoomOut
=
function
(
args
)
{
if
(
!
args
)
args
=
{};
if
(
!
args
.
amount
)
args
.
amount
=
plot
.
getOptions
().
zoom
.
amount
;
args
.
amount
=
1
/
args
.
amount
;
plot
.
zoom
(
args
);
};
plot
.
zoom
=
function
(
args
)
{
if
(
!
args
)
args
=
{};
var
c
=
args
.
center
,
amount
=
args
.
amount
||
plot
.
getOptions
().
zoom
.
amount
,
w
=
plot
.
width
(),
h
=
plot
.
height
();
if
(
!
c
)
c
=
{
left
:
w
/
2
,
top
:
h
/
2
};
var
xf
=
c
.
left
/
w
,
yf
=
c
.
top
/
h
,
minmax
=
{
x
:
{
min
:
c
.
left
-
xf
*
w
/
amount
,
max
:
c
.
left
+
(
1
-
xf
)
*
w
/
amount
},
y
:
{
min
:
c
.
top
-
yf
*
h
/
amount
,
max
:
c
.
top
+
(
1
-
yf
)
*
h
/
amount
}
};
$
.
each
(
plot
.
getAxes
(),
function
(
_
,
axis
)
{
var
opts
=
axis
.
options
,
min
=
minmax
[
axis
.
direction
].
min
,
max
=
minmax
[
axis
.
direction
].
max
,
zr
=
opts
.
zoomRange
,
pr
=
opts
.
panRange
;
if
(
zr
===
false
)
// no zooming on this axis
return
;
min
=
axis
.
c2p
(
min
);
max
=
axis
.
c2p
(
max
);
if
(
min
>
max
)
{
// make sure min < max
var
tmp
=
min
;
min
=
max
;
max
=
tmp
;
}
//Check that we are in panRange
if
(
pr
)
{
if
(
pr
[
0
]
!=
null
&&
min
<
pr
[
0
])
{
min
=
pr
[
0
];
}
if
(
pr
[
1
]
!=
null
&&
max
>
pr
[
1
])
{
max
=
pr
[
1
];
}
}
var
range
=
max
-
min
;
if
(
zr
&&
((
zr
[
0
]
!=
null
&&
range
<
zr
[
0
]
&&
amount
>
1
)
||
(
zr
[
1
]
!=
null
&&
range
>
zr
[
1
]
&&
amount
<
1
)))
return
;
opts
.
min
=
min
;
opts
.
max
=
max
;
});
plot
.
setupGrid
();
plot
.
draw
();
if
(
!
args
.
preventEvent
)
plot
.
getPlaceholder
().
trigger
(
"plotzoom"
,
[
plot
,
args
]);
};
plot
.
pan
=
function
(
args
)
{
var
delta
=
{
x
:
+
args
.
left
,
y
:
+
args
.
top
};
if
(
isNaN
(
delta
.
x
))
delta
.
x
=
0
;
if
(
isNaN
(
delta
.
y
))
delta
.
y
=
0
;
$
.
each
(
plot
.
getAxes
(),
function
(
_
,
axis
)
{
var
opts
=
axis
.
options
,
min
,
max
,
d
=
delta
[
axis
.
direction
];
min
=
axis
.
c2p
(
axis
.
p2c
(
axis
.
min
)
+
d
),
max
=
axis
.
c2p
(
axis
.
p2c
(
axis
.
max
)
+
d
);
var
pr
=
opts
.
panRange
;
if
(
pr
===
false
)
// no panning on this axis
return
;
if
(
pr
)
{
// check whether we hit the wall
if
(
pr
[
0
]
!=
null
&&
pr
[
0
]
>
min
)
{
d
=
pr
[
0
]
-
min
;
min
+=
d
;
max
+=
d
;
}
if
(
pr
[
1
]
!=
null
&&
pr
[
1
]
<
max
)
{
d
=
pr
[
1
]
-
max
;
min
+=
d
;
max
+=
d
;
}
}
opts
.
min
=
min
;
opts
.
max
=
max
;
});
plot
.
setupGrid
();
plot
.
draw
();
if
(
!
args
.
preventEvent
)
plot
.
getPlaceholder
().
trigger
(
"plotpan"
,
[
plot
,
args
]);
};
function
shutdown
(
plot
,
eventHolder
)
{
eventHolder
.
unbind
(
plot
.
getOptions
().
zoom
.
trigger
,
onZoomClick
);
eventHolder
.
unbind
(
"mousewheel"
,
onMouseWheel
);
eventHolder
.
unbind
(
"dragstart"
,
onDragStart
);
eventHolder
.
unbind
(
"drag"
,
onDrag
);
eventHolder
.
unbind
(
"dragend"
,
onDragEnd
);
if
(
panTimeout
)
clearTimeout
(
panTimeout
);
}
plot
.
hooks
.
bindEvents
.
push
(
bindEvents
);
plot
.
hooks
.
shutdown
.
push
(
shutdown
);
}
$
.
plot
.
plugins
.
push
({
init
:
init
,
options
:
options
,
name
:
'navigate'
,
version
:
'1.3'
});
})(
jQuery
);
tests/Issue18.htm
0 → 100644
View file @
d1dc90e8
<hmtl>
<head>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=iso-8859-1"
/>
<title>
CurvedLines Plugin for flot
</title>
<script
src=
"http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"
></script>
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../flot/excanvas.min.js"></script><![endif]-->
<script
language=
"javascript"
type=
"text/javascript"
src=
"../flot/jquery.flot.js"
></script>
<script
language=
"JavaScript"
type=
"text/javascript"
src=
"../flot/jquery.flot.time.js"
></script>
<script
language=
"JavaScript"
type=
"text/javascript"
src=
"../flot/jquery.flot.navigate.js"
></script>
<script
language=
"JavaScript"
type=
"text/javascript"
src=
"../curvedLines.js"
></script>
</head>
<body>
<div
id=
"placeholder"
style=
"width: 800;height: 400;"
></div>
<script
id=
"source"
language=
"javascript"
type=
"text/javascript"
>
$
(
function
()
{
var
options
=
{
series
:
{
curvedLines
:
{
active
:
true
}
},
xaxis
:
{
mode
:
"time"
,
tickSize
:
[
1
,
"day"
],
timezone
:
"browser"
,
timeformat
:
"%m/%d%a"
,
min
:
1393396200000
,
max
:
1394073000000
,
tickLength
:
0
,
panRange
:
[
1378809000000
,
1394505000000
],
dayNames
:
[
"S"
,
"M"
,
"T"
,
"W"
,
"T"
,
"F"
,
"S"
]
},
yaxis
:
{
panRange
:
[
0
,
500
],
ticks
:
[
'0'
,
'70'
,
'130'
,
'180'
,
'200'
,
'300'
,
'400'
,
'500'
],
tickLength
:
0
,
tickDecimals
:
0
},
pan
:
{
interactive
:
true
}
}
var
dataSet
=
[
[
1385490600000
,
150
],
[
1386009000000
,
450
],
[
1392834600000
,
444
],
[
1393266600000
,
100
],
[
1393353000000
,
147
],
[
1393439400000
,
105
],
[
1393525800000
,
179.5
],
[
1393612200000
,
85
],
[
1393871400000
,
107.5
]
];
//SUMMARY
//
//Depending on your data you might have to adjust the parameters curvePointFactor and (unlikely) fitPointDist.
//Use this example to learn:
//
// - how to track down such problems (activate/deactivate dataShowVirtualPoints line 147 to see the created virtual points)
// - more details about the curvePointFactor (important!)
// - more details about fitPointDist
//CURVE POINT FACTOR
// defines how many "virtual" points are used per "real" data point to
// emulate the curvedLines (points total = real points * curvePointFactor)
//
//For the current example we start with 9 data points that are extended by the default factor of 20 which leads to
//180 data points including 9 original data points and if fit is true further 16 inner min max helpers (2 * 9) - 2).
//These virtual data points are equally distributed on the x-Axis!
//
//This is a sensitive parameter. If curvePointFactor is choosen too large performance will degenerate because of the
//potentially thousands of additional points. But if it is choosen to low the curviness will not be achieved.
//
//In the current example 20 is to low. The problem is that the input data contains a huge gap on the xaxis and
//nearly all of the virtual data points end up on the straight line that bridges the gap. To less virtual points are
//placed between the original data points at the start and end of the plot and the bending does not work.
//
//Increase the curvePointFactor to e.g. 200 to solve the problem. To find an appropriate value for your data consider the
//maximum amount of data points that you will face as well as their distirbution.
//FIT POINT DIST:
// defines the x axis distance of the additional two points that are used
// to enforce the min max condition.
//
//Two points are placed near the original data point to get the min/max point of the curve at a real data point.
//These two virtual points should be close (less than one pixel) to the real data point.
//
//CurvedLines estimates the distance with the following formula: fpDist = (maxX - minX) / (500 * 100);
//The xrange of the plot is devided by a (wild guessed) plot width of 500 pixels and then subdevided by 100 to get
//below one pixel. I.e. for plots without panning and a div width of 500 we would get a fpDist of 1/100 pixels.
//
//Of course in reality these guesses might be far off. However the parameter is quite robust and the guessed value will
//often be good enough.
//
//In this plot the calculated value is 167.616 and values between 5.000.000 and 1 would still work.
//If you want to screw things up try something like 10.000.000 ...
//
//=> The fitPointDist should normally work for you however if you use a vast panning range or very large/very small numbers
// you might want to define it on your own.
//
// E.g. lets aim for 1/10 of a pixel for our current example plot:
// 1 day ~ 100 pixels = 86.400.000
// 1 pixel ~ 864000
// 1/10 pixel ~ 86400
var
dataLinesArray
=
{
data
:
dataSet
,
lines
:
{
show
:
true
},
curvedLines
:
{
apply
:
true
,
/*play with parameters (lines)*/
//fitPointDist: 86400,
//curvePointFactor: 200,
fit
:
true
},
clickable
:
false
,
hoverable
:
false
,
color
:
'#7D177A'
};
var
dataShowVirtualPoints
=
{
data
:
dataSet
,
points
:
{
show
:
true
},
curvedLines
:
{
apply
:
true
,
/*play with parameters (points)*/
//fitPointDist: 86400,
//curvePointFactor: 200,
fit
:
true
},
color
:
'#FF0000'
};
var
Data
=
[];
Data
.
push
(
dataLinesArray
);
/*see virtual points*/
//Data.push(dataShowVirtualPoints);
$
.
plot
(
"#placeholder"
,
Data
,
options
);
});
</script>
</body>
</hmtl>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment