Вход Регистрация
Файл: Main Website Files/assets/bower_components/flot/jquery.flot.errorbars.js
Строк: 293
<?php
/* Flot plugin for plotting error bars.

Copyright (c) 2007-2014 IOLA and Ole Laursen.
Licensed under the MIT license.

Error bars are used to show standard deviation and other statistical
properties in a plot.

* Created by Rui Pereira  -  rui (dot) pereira (at) gmail (dot) com

This plugin allows you to plot error-bars over points. Set "errorbars" inside
the points series to the axis name over which there will be error values in
your data array (*even* if you do not intend to plot them later, by setting
"show: null" on xerr/yerr).

The plugin supports these options:

    series: {
        points: {
            errorbars: "x" or "y" or "xy",
            xerr: {
                show: null/false or true,
                asymmetric: null/false or true,
                upperCap: null or "-" or function,
                lowerCap: null or "-" or function,
                color: null or color,
                radius: null or number
            },
            yerr: { same options as xerr }
        }
    }

Each data point array is expected to be of the type:

    "x"  [ x, y, xerr ]
    "y"  [ x, y, yerr ]
    "xy" [ x, y, xerr, yerr ]

Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and
equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric
error-bars on X and asymmetric on Y would be:

    [ x, y, xerr, yerr_lower, yerr_upper ]

By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will
draw a small cap perpendicular to the error bar. They can also be set to a
user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg.

    function drawSemiCircle( ctx, x, y, radius ) {
        ctx.beginPath();
        ctx.arc( x, y, radius, 0, Math.PI, false );
        ctx.moveTo( x - radius, y );
        ctx.lineTo( x + radius, y );
        ctx.stroke();
    }

Color and radius both default to the same ones of the points series if not
set. The independent radius parameter on xerr/yerr is useful for the case when
we may want to add error-bars to a line, without showing the interconnecting
points (with radius: 0), and still showing end caps on the error-bars.
shadowSize and lineWidth are derived as well from the points series.

*/

(function ($) {
    var 
options = {
        
series: {
            
points: {
                
errorbarsnull//should be 'x', 'y' or 'xy'
                
xerr: { err'x'shownullasymmetricnullupperCapnulllowerCapnullcolornullradiusnull},
                
yerr: { err'y'shownullasymmetricnullupperCapnulllowerCapnullcolornullradiusnull}
            }
        }
    };

    function 
processRawData(plotseriesdatadatapoints){
        if (!
series.points.errorbars)
            return;

        
// x,y values
        
var format = [
            { 
xtruenumbertruerequiredtrue },
            { 
ytruenumbertruerequiredtrue }
        ];

        var 
errors series.points.errorbars;
        
// error bars - first X then Y
        
if (errors == 'x' || errors == 'xy') {
            
// lower / upper error
            
if (series.points.xerr.asymmetric) {
                
format.push({ xtruenumbertruerequiredtrue });
                
format.push({ xtruenumbertruerequiredtrue });
            } else
                
format.push({ xtruenumbertruerequiredtrue });
        }
        if (
errors == 'y' || errors == 'xy') {
            
// lower / upper error
            
if (series.points.yerr.asymmetric) {
                
format.push({ ytruenumbertruerequiredtrue });
                
format.push({ ytruenumbertruerequiredtrue });
            } else
                
format.push({ ytruenumbertruerequiredtrue });
        }
        
datapoints.format format;
    }

    function 
parseErrors(seriesi){

        var 
points series.datapoints.points;

        
// read errors from points array
        
var exl null,
                
exu null,
                
eyl null,
                
eyu null;
        var 
xerr series.points.xerr,
                
yerr series.points.yerr;

        var 
eb series.points.errorbars;
        
// error bars - first X
        
if (eb == 'x' || eb == 'xy') {
            if (
xerr.asymmetric) {
                
exl points[2];
                
exu points[3];
                if (
eb == 'xy')
                    if (
yerr.asymmetric){
                        
eyl points[4];
                        
eyu points[5];
                    } else 
eyl points[4];
            } else {
                
exl points[2];
                if (
eb == 'xy')
                    if (
yerr.asymmetric) {
                        
eyl points[3];
                        
eyu points[4];
                    } else 
eyl points[3];
            }
        
// only Y
        
} else if (eb == 'y')
            if (
yerr.asymmetric) {
                
eyl points[2];
                
eyu points[3];
            } else 
eyl points[2];

        
// symmetric errors?
        
if (exu == nullexu exl;
        if (
eyu == nulleyu eyl;

        var 
errRanges = [exlexueyleyu];
        
// nullify if not showing
        
if (!xerr.show){
            
errRanges[0] = null;
            
errRanges[1] = null;
        }
        if (!
yerr.show){
            
errRanges[2] = null;
            
errRanges[3] = null;
        }
        return 
errRanges;
    }

    function 
drawSeriesErrors(plotctxs){

        var 
points s.datapoints.points,
                
ps s.datapoints.pointsize,
                
ax = [s.xaxiss.yaxis],
                
radius s.points.radius,
                
err = [s.points.xerrs.points.yerr];

        
//sanity check, in case some inverted axis hack is applied to flot
        
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 
0s.datapoints.points.length+= ps) {

            
//parse
            
var errRanges parseErrors(si);

            
//cycle xerr & yerr
            
for (var 0err.lengthe++){

                var 
minmax = [ax[e].minax[e].max];

                
//draw this error?
                
if (errRanges[err.length]){

                    
//data coordinates
                    
var points[i],
                        
points[1];

                    
//errorbar ranges
                    
var upper = [xy][e] + errRanges[err.length 1],
                        
lower = [xy][e] - errRanges[err.length];

                    
//points outside of the canvas
                    
if (err[e].err == 'x')
                        if (
ax[1].max || ax[1].min || upper ax[0].min || lower ax[0].max)
                            continue;
                    if (
err[e].err == 'y')
                        if (
ax[0].max || ax[0].min || upper ax[1].min || lower ax[1].max)
                            continue;

                    
// prevent errorbars getting out of the canvas
                    
var drawUpper true,
                        
drawLower true;

                    if (
upper minmax[1]) {
                        
drawUpper false;
                        
upper minmax[1];
                    }
                    if (
lower minmax[0]) {
                        
drawLower false;
                        
lower minmax[0];
                    }

                    
//sanity check, in case some inverted axis hack is applied to flot
                    
if ((err[e].err == 'x' && invertX) || (err[e].err == 'y' && invertY)) {
                        
//swap coordinates
                        
var tmp lower;
                        
lower upper;
                        
upper tmp;
                        
tmp drawLower;
                        
drawLower drawUpper;
                        
drawUpper tmp;
                        
tmp minmax[0];
                        
minmax[0] = minmax[1];
                        
minmax[1] = tmp;
                    }

                    
// convert to pixels
                    
ax[0].p2c(x),
                        
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]);

                    
//same style as points by default
                    
var lw err[e].lineWidth err[e].lineWidth s.points.lineWidth,
                        
sw s.points.shadowSize != null s.points.shadowSize s.shadowSize;

                    
//shadow as for points
                    
if (lw && sw 0) {
                        var 
sw 2;
                        
ctx.lineWidth w;
                        
ctx.strokeStyle "rgba(0,0,0,0.1)";
                        
drawError(ctxerr[e], xyupperlowerdrawUpperdrawLowerradiusw/2minmax);

                        
ctx.strokeStyle "rgba(0,0,0,0.2)";
                        
drawError(ctxerr[e], xyupperlowerdrawUpperdrawLowerradiusw/2minmax);
                    }

                    
ctx.strokeStyle err[e].colorerr[e].colors.color;
                    
ctx.lineWidth lw;
                    
//draw it
                    
drawError(ctxerr[e], xyupperlowerdrawUpperdrawLowerradius0minmax);
                }
            }
        }
    }

    function 
drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,offset,minmax){

        
//shadow offset
        
+= offset;
        
upper += offset;
        
lower += offset;

        
// error bar - avoid plotting over circles
        
if (err.err == 'x'){
            if (
upper radiusdrawPath(ctx, [[upper,y],[Math.max(radius,minmax[0]),y]]);
            else 
drawUpper false;
            if (
lower radiusdrawPath(ctx, [[Math.min(radius,minmax[1]),y],[lower,y]] );
            else 
drawLower false;
        }
        else {
            if (
upper radiusdrawPath(ctx, [[x,upper],[x,Math.min(radius,minmax[0])]] );
            else 
drawUpper false;
            if (
lower radiusdrawPath(ctx, [[x,Math.max(radius,minmax[1])],[x,lower]] );
            else 
drawLower false;
        }

        
//internal radius value in errorbar, allows to plot radius 0 points and still keep proper sized caps
        //this is a way to get errorbars on lines without visible connecting dots
        
radius err.radius != nullerr.radiusradius;

        
// upper cap
        
if (drawUpper) {
            if (
err.upperCap == '-'){
                if (
err.err=='x'drawPath(ctx, [[upper,radius],[upper,radius]] );
                else 
drawPath(ctx, [[radius,upper],[radius,upper]] );
            } else if ($.
isFunction(err.upperCap)){
                if (
err.err=='x'err.upperCap(ctxupperyradius);
                else 
err.upperCap(ctxxupperradius);
            }
        }
        
// lower cap
        
if (drawLower) {
            if (
err.lowerCap == '-'){
                if (
err.err=='x'drawPath(ctx, [[lower,radius],[lower,radius]] );
                else 
drawPath(ctx, [[radius,lower],[radius,lower]] );
            } else if ($.
isFunction(err.lowerCap)){
                if (
err.err=='x'err.lowerCap(ctxloweryradius);
                else 
err.lowerCap(ctxxlowerradius);
            }
        }
    }

    function 
drawPath(ctxpts){
        
ctx.beginPath();
        
ctx.moveTo(pts[0][0], pts[0][1]);
        for (var 
p=1pts.lengthp++)
            
ctx.lineTo(pts[p][0], pts[p][1]);
        
ctx.stroke();
    }

    function 
draw(plotctx){
        var 
plotOffset plot.getPlotOffset();

        
ctx.save();
        
ctx.translate(plotOffset.leftplotOffset.top);
        $.
each(plot.getData(), function (is) {
            if (
s.points.errorbars && (s.points.xerr.show || s.points.yerr.show))
                
drawSeriesErrors(plotctxs);
        });
        
ctx.restore();
    }

    function 
init(plot) {
        
plot.hooks.processRawData.push(processRawData);
        
plot.hooks.draw.push(draw);
    }

    $.
plot.plugins.push({
                
initinit,
                
optionsoptions,
                
name'errorbars',
                
version'1.0'
            
});
})(
jQuery);
?>
Онлайн: 2
Реклама