Вход Регистрация
Файл: CloudBox-main/CloudBox/admin_assets/js/chart/flot/jquery.flot.pie.js
Строк: 828
<?php
/* Flot plugin for rendering pie charts.

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

 The plugin assumes that each series has a single data value, and that each
 value is a positive integer or zero.  Negative numbers don't make sense for a
 pie chart, and have unpredictable results.  The values do NOT need to be
 passed in as percentages; the plugin will calculate the total and per-slice
 percentages internally.

 * Created by Brian Medendorp

 * Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars

 The plugin supports these options:

 series: {
 pie: {
 show: true/false
 radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'
 innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect
 startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
 tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)
 offset: {
 top: integer value to move the pie up or down
 left: integer value to move the pie left or right, or 'auto'
 },
 stroke: {
 color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')
 width: integer pixel width of the stroke
 },
 label: {
 show: true/false, or 'auto'
 formatter:  a user-defined function that modifies the text/style of the label text
 radius: 0-1 for percentage of fullsize, or a specified pixel length
 background: {
 color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')
 opacity: 0-1
 },
 threshold: 0-1 for the percentage value at which to hide labels (if they're too small)
 },
 combine: {
 threshold: 0-1 for the percentage value at which to combine slices (if they're too small)
 color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined
 label: any text value of what the combined slice should be labeled
 }
 highlight: {
 opacity: 0-1
 }
 }
 }

 More detail and specific examples can be found in the included HTML file.

 */

(function ($) {

    
// Maximum redraw attempts when fitting labels within the plot

    
var REDRAW_ATTEMPTS = 10;

    
// Factor by which to shrink the pie when fitting labels within the plot

    
var REDRAW_SHRINK = 0.95;

    function 
init(plot) {

        var 
canvas = null,
            
target = null,
            
options = null,
            
maxRadius = null,
            
centerLeft = null,
            
centerTop = null,
            
processed = false,
            
ctx = null;

        
// interactive variables

        
var highlights = [];

        
// add hook to determine if pie plugin in enabled, and then perform necessary operations

        
plot.hooks.processOptions.push(function (plot, options) {
            if (
options.series.pie.show) {

                
options.grid.show = false;

                
// set labels.show

                
if (options.series.pie.label.show == "auto") {
                    if (
options.legend.show) {
                        
options.series.pie.label.show = false;
                    } else {
                        
options.series.pie.label.show = true;
                    }
                }

                
// set radius

                
if (options.series.pie.radius == "auto") {
                    if (
options.series.pie.label.show) {
                        
options.series.pie.radius = 3 / 4;
                    } else {
                        
options.series.pie.radius = 1;
                    }
                }

                
// ensure sane tilt

                
if (options.series.pie.tilt > 1) {
                    
options.series.pie.tilt = 1;
                } else if (
options.series.pie.tilt < 0) {
                    
options.series.pie.tilt = 0;
                }
            }
        });

        
plot.hooks.bindEvents.push(function (plot, eventHolder) {
            var 
options = plot.getOptions();
            if (
options.series.pie.show) {
                if (
options.grid.hoverable) {
                    
eventHolder.unbind("mousemove").mousemove(onMouseMove);
                }
                if (
options.grid.clickable) {
                    
eventHolder.unbind("click").click(onClick);
                }
            }
        });

        
plot.hooks.processDatapoints.push(function (plot, series, data, datapoints) {
            var 
options = plot.getOptions();
            if (
options.series.pie.show) {
                
processDatapoints(plot, series, data, datapoints);
            }
        });

        
plot.hooks.drawOverlay.push(function (plot, octx) {
            var 
options = plot.getOptions();
            if (
options.series.pie.show) {
                
drawOverlay(plot, octx);
            }
        });

        
plot.hooks.draw.push(function (plot, newCtx) {
            var 
options = plot.getOptions();
            if (
options.series.pie.show) {
                
draw(plot, newCtx);
            }
        });

        function 
processDatapoints(plot, series, datapoints) {
            if (!
processed) {
                
processed = true;
                
canvas = plot.getCanvas();
                
target = $(canvas).parent();
                
options = plot.getOptions();
                
plot.setData(combine(plot.getData()));
            }
        }

        function 
combine(data) {

            var 
total = 0,
                
combined = 0,
                
numCombined = 0,
                
color = options.series.pie.combine.color,
                
newdata = [];

            
// Fix up the raw data from Flot, ensuring the data is numeric

            
for (var i = 0; i < data.length; ++i) {

                var 
value = data[i].data;

                
// If the data is an array, we'll assume that it's a standard
                // Flot x-y pair, and are concerned only with the second value.

                // Note how we use the original array, rather than creating a
                // new one; this is more efficient and preserves any extra data
                // that the user may have stored in higher indexes.

                
if ($.isArray(value) && value.length == 1) {
                    
value = value[0];
                }

                if ($.
isArray(value)) {
                    
// Equivalent to $.isNumeric() but compatible with jQuery < 1.7
                    
if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {
                        
value[1] = +value[1];
                    } else {
                        
value[1] = 0;
                    }
                } else if (!
isNaN(parseFloat(value)) && isFinite(value)) {
                    
value = [1, +value];
                } else {
                    
value = [1, 0];
                }

                
data[i].data = [value];
            }

            
// Sum up all the slices, so we can calculate percentages for each

            
for (var i = 0; i < data.length; ++i) {
                
total += data[i].data[0][1];
            }

            
// Count the number of slices with percentages below the combine
            // threshold; if it turns out to be just one, we won't combine.

            
for (var i = 0; i < data.length; ++i) {
                var 
value = data[i].data[0][1];
                if (
value / total <= options.series.pie.combine.threshold) {
                    
combined += value;
                    
numCombined++;
                    if (!
color) {
                        
color = data[i].color;
                    }
                }
            }

            for (var 
i = 0; i < data.length; ++i) {
                var 
value = data[i].data[0][1];
                if (
numCombined < 2 || value / total > options.series.pie.combine.threshold) {
                    
newdata.push(
                        $.
extend(data[i], {     /* extend to allow keeping all other original data values
                         and using them e.g. in labelFormatter. */
                            
data: [
                                [
1, value]
                            ],
                            
color: data[i].color,
                            
label: data[i].label,
                            
angle: value * Math.PI * 2 / total,
                            
percent: value / (total / 100)
                        })
                    );
                }
            }

            if (
numCombined > 1) {
                
newdata.push({
                    
data: [
                        [
1, combined]
                    ],
                    
color: color,
                    
label: options.series.pie.combine.label,
                    
angle: combined * Math.PI * 2 / total,
                    
percent: combined / (total / 100)
                });
            }

            return 
newdata;
        }

        function 
draw(plot, newCtx) {

            if (!
target) {
                return; 
// if no series were passed
            
}

            var 
canvasWidth = plot.getPlaceholder().width(),
                
canvasHeight = plot.getPlaceholder().height(),
                
legendWidth = target.children().filter(".legend").children().width() || 0;

            
ctx = newCtx;

            
// WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!

            // When combining smaller slices into an 'other' slice, we need to
            // add a new series.  Since Flot gives plugins no way to modify the
            // list of series, the pie plugin uses a hack where the first call
            // to processDatapoints results in a call to setData with the new
            // list of series, then subsequent processDatapoints do nothing.

            // The plugin-global 'processed' flag is used to control this hack;
            // it starts out false, and is set to true after the first call to
            // processDatapoints.

            // Unfortunately this turns future setData calls into no-ops; they
            // call processDatapoints, the flag is true, and nothing happens.

            // To fix this we'll set the flag back to false here in draw, when
            // all series have been processed, so the next sequence of calls to
            // processDatapoints once again starts out with a slice-combine.
            // This is really a hack; in 0.9 we need to give plugins a proper
            // way to modify series before any processing begins.

            
processed = false;

            
// calculate maximum radius and center point

            
maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;
            
centerTop = canvasHeight / 2 + options.series.pie.offset.top;
            
centerLeft = canvasWidth / 2;

            if (
options.series.pie.offset.left == "auto") {
                if (
options.legend.position.match("w")) {
                    
centerLeft += legendWidth / 2;
                } else {
                    
centerLeft -= legendWidth / 2;
                }
                if (
centerLeft < maxRadius) {
                    
centerLeft = maxRadius;
                } else if (
centerLeft > canvasWidth - maxRadius) {
                    
centerLeft = canvasWidth - maxRadius;
                }
            } else {
                
centerLeft += options.series.pie.offset.left;
            }

            var 
slices = plot.getData(),
                
attempts = 0;

            
// Keep shrinking the pie's radius until drawPie returns true,
            // indicating that all the labels fit, or we try too many times.

            
do {
                if (
attempts > 0) {
                    
maxRadius *= REDRAW_SHRINK;
                }
                
attempts += 1;
                
clear();
                if (
options.series.pie.tilt <= 0.8) {
                    
drawShadow();
                }
            } while (!
drawPie() && attempts < REDRAW_ATTEMPTS)

            if (
attempts >= REDRAW_ATTEMPTS) {
                
clear();
                
target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>");
            }

            if (
plot.setSeries && plot.insertLegend) {
                
plot.setSeries(slices);
                
plot.insertLegend();
            }

            
// we're actually done at this point, just defining internal functions at this point

            
function clear() {
                
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
                
target.children().filter(".pieLabel, .pieLabelBackground").remove();
            }

            function 
drawShadow() {

                var 
shadowLeft = options.series.pie.shadow.left;
                var 
shadowTop = options.series.pie.shadow.top;
                var 
edge = 10;
                var 
alpha = options.series.pie.shadow.alpha;
                var 
radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;

                if (
radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {
                    return;    
// shadow would be outside canvas, so don't draw it
                
}

                
ctx.save();
                
ctx.translate(shadowLeft, shadowTop);
                
ctx.globalAlpha = alpha;
                
ctx.fillStyle = "#000";

                
// center and rotate to starting position

                
ctx.translate(centerLeft, centerTop);
                
ctx.scale(1, options.series.pie.tilt);

                
//radius -= edge;

                
for (var i = 1; i <= edge; i++) {
                    
ctx.beginPath();
                    
ctx.arc(0, 0, radius, 0, Math.PI * 2, false);
                    
ctx.fill();
                    
radius -= i;
                }

                
ctx.restore();
            }

            function 
drawPie() {

                var 
startAngle = Math.PI * options.series.pie.startAngle;
                var 
radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;

                
// center and rotate to starting position

                
ctx.save();
                
ctx.translate(centerLeft, centerTop);
                
ctx.scale(1, options.series.pie.tilt);
                
//ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera

                // draw slices

                
ctx.save();
                var 
currentAngle = startAngle;
                for (var 
i = 0; i < slices.length; ++i) {
                    
slices[i].startAngle = currentAngle;
                    
drawSlice(slices[i].angle, slices[i].color, true);
                }
                
ctx.restore();

                
// draw slice outlines

                
if (options.series.pie.stroke.width > 0) {
                    
ctx.save();
                    
ctx.lineWidth = options.series.pie.stroke.width;
                    
currentAngle = startAngle;
                    for (var 
i = 0; i < slices.length; ++i) {
                        
drawSlice(slices[i].angle, options.series.pie.stroke.color, false);
                    }
                    
ctx.restore();
                }

                
// draw donut hole

                
drawDonutHole(ctx);

                
ctx.restore();

                
// Draw the labels, returning true if they fit within the plot

                
if (options.series.pie.label.show) {
                    return 
drawLabels();
                } else return 
true;

                function 
drawSlice(angle, color, fill) {

                    if (
angle <= 0 || isNaN(angle)) {
                        return;
                    }

                    if (
fill) {
                        
ctx.fillStyle = color;
                    } else {
                        
ctx.strokeStyle = color;
                        
ctx.lineJoin = "round";
                    }

                    
ctx.beginPath();
                    if (
Math.abs(angle - Math.PI * 2) > 0.000000001) {
                        
ctx.moveTo(0, 0); // Center of the pie
                    
}

                    
//ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera
                    
ctx.arc(0, 0, radius, currentAngle, currentAngle + angle / 2, false);
                    
ctx.arc(0, 0, radius, currentAngle + angle / 2, currentAngle + angle, false);
                    
ctx.closePath();
                    
//ctx.rotate(angle); // This doesn't work properly in Opera
                    
currentAngle += angle;

                    if (
fill) {
                        
ctx.fill();
                    } else {
                        
ctx.stroke();
                    }
                }

                function 
drawLabels() {

                    var 
currentAngle = startAngle;
                    var 
radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;

                    for (var 
i = 0; i < slices.length; ++i) {
                        if (
slices[i].percent >= options.series.pie.label.threshold * 100) {
                            if (!
drawLabel(slices[i], currentAngle, i)) {
                                return 
false;
                            }
                        }
                        
currentAngle += slices[i].angle;
                    }

                    return 
true;

                    function 
drawLabel(slice, startAngle, index) {

                        if (
slice.data[0][1] == 0) {
                            return 
true;
                        }

                        
// format label text

                        
var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;

                        if (
lf) {
                            
text = lf(slice.label, slice);
                        } else {
                            
text = slice.label;
                        }

                        if (
plf) {
                            
text = plf(text, slice);
                        }

                        var 
halfAngle = ((startAngle + slice.angle) + startAngle) / 2;
                        var 
x = centerLeft + Math.round(Math.cos(halfAngle) * radius);
                        var 
y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;

                        var 
html = "<span class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y + "px;left:" + x + "px;'>" + text + "</span>";
                        
target.append(html);

                        var 
label = target.children("#pieLabel" + index);
                        var 
labelTop = (y - label.height() / 2);
                        var 
labelLeft = (x - label.width() / 2);

                        
label.css("top", labelTop);
                        
label.css("left", labelLeft);

                        
// check to make sure that the label is not outside the canvas

                        
if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {
                            return 
false;
                        }

                        if (
options.series.pie.label.background.opacity != 0) {

                            
// put in the transparent background separately to avoid blended labels and label boxes

                            
var c = options.series.pie.label.background.color;

                            if (
c == null) {
                                
c = slice.color;
                            }

                            var 
pos = "top:" + labelTop + "px;left:" + labelLeft + "px;";
                            $(
"<div class='pieLabelBackground' style='position:absolute;width:" + label.width() + "px;height:" + label.height() + "px;" + pos + "background-color:" + c + ";'></div>")
                                .
css("opacity", options.series.pie.label.background.opacity)
                                .
insertBefore(label);
                        }

                        return 
true;
                    } 
// end individual label function
                
} // end drawLabels function
            
} // end drawPie function
        
} // end draw function

        // Placed here because it needs to be accessed from multiple locations

        
function drawDonutHole(layer) {
            if (
options.series.pie.innerRadius > 0) {

                
// subtract the center

                
layer.save();
                var 
innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;
                
layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color
                
layer.beginPath();
                
layer.fillStyle = options.series.pie.stroke.color;
                
layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
                
layer.fill();
                
layer.closePath();
                
layer.restore();

                
// add inner stroke

                
layer.save();
                
layer.beginPath();
                
layer.strokeStyle = options.series.pie.stroke.color;
                
layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
                
layer.stroke();
                
layer.closePath();
                
layer.restore();

                
// TODO: add extra shadow inside hole (with a mask) if the pie is tilted.
            
}
        }

        
//-- Additional Interactive related functions --

        
function isPointInPoly(poly, pt) {
            for (var 
c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
                ((
poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1] < poly[i][1]))
                    && (
pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
                && (
c = !c);
            return 
c;
        }

        function 
findNearbySlice(mouseX, mouseY) {

            var 
slices = plot.getData(),
                
options = plot.getOptions(),
                
radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,
                
x, y;

            for (var 
i = 0; i < slices.length; ++i) {

                var 
s = slices[i];

                if (
s.pie.show) {

                    
ctx.save();
                    
ctx.beginPath();
                    
ctx.moveTo(0, 0); // Center of the pie
                    //ctx.scale(1, options.series.pie.tilt);    // this actually seems to break everything when here.
                    
ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);
                    
ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);
                    
ctx.closePath();
                    
x = mouseX - centerLeft;
                    
y = mouseY - centerTop;

                    if (
ctx.isPointInPath) {
                        if (
ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {
                            
ctx.restore();
                            return {
                                
datapoint: [s.percent, s.data],
                                
dataIndex: 0,
                                
series: s,
                                
seriesIndex: i
                            
};
                        }
                    } else {

                        
// excanvas for IE doesn;t support isPointInPath, this is a workaround.

                        
var p1X = radius * Math.cos(s.startAngle),
                            
p1Y = radius * Math.sin(s.startAngle),
                            
p2X = radius * Math.cos(s.startAngle + s.angle / 4),
                            
p2Y = radius * Math.sin(s.startAngle + s.angle / 4),
                            
p3X = radius * Math.cos(s.startAngle + s.angle / 2),
                            
p3Y = radius * Math.sin(s.startAngle + s.angle / 2),
                            
p4X = radius * Math.cos(s.startAngle + s.angle / 1.5),
                            
p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),
                            
p5X = radius * Math.cos(s.startAngle + s.angle),
                            
p5Y = radius * Math.sin(s.startAngle + s.angle),
                            
arrPoly = [
                                [
0, 0],
                                [
p1X, p1Y],
                                [
p2X, p2Y],
                                [
p3X, p3Y],
                                [
p4X, p4Y],
                                [
p5X, p5Y]
                            ],
                            
arrPoint = [x, y];

                        
// TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?

                        
if (isPointInPoly(arrPoly, arrPoint)) {
                            
ctx.restore();
                            return {
                                
datapoint: [s.percent, s.data],
                                
dataIndex: 0,
                                
series: s,
                                
seriesIndex: i
                            
};
                        }
                    }

                    
ctx.restore();
                }
            }

            return 
null;
        }

        function 
onMouseMove(e) {
            
triggerClickHoverEvent("plothover", e);
        }

        function 
onClick(e) {
            
triggerClickHoverEvent("plotclick", e);
        }

        
// trigger click or hover event (they send the same parameters so we share their code)

        
function triggerClickHoverEvent(eventname, e) {

            var 
offset = plot.offset();
            var 
canvasX = parseInt(e.pageX - offset.left);
            var 
canvasY = parseInt(e.pageY - offset.top);
            var 
item = findNearbySlice(canvasX, canvasY);

            if (
options.grid.autoHighlight) {

                
// clear auto-highlights

                
for (var i = 0; i < highlights.length; ++i) {
                    var 
h = highlights[i];
                    if (
h.auto == eventname && !(item && h.series == item.series)) {
                        
unhighlight(h.series);
                    }
                }
            }

            
// highlight the slice

            
if (item) {
                
highlight(item.series, eventname);
            }

            
// trigger any hover bind events

            
var pos = { pageX: e.pageX, pageY: e.pageY };
            
target.trigger(eventname, [pos, item]);
        }

        function 
highlight(s, auto) {
            
//if (typeof s == "number") {
            //    s = series[s];
            //}

            
var i = indexOfHighlight(s);

            if (
i == -1) {
                
highlights.push({ series: s, auto: auto });
                
plot.triggerRedrawOverlay();
            } else if (!
auto) {
                
highlights[i].auto = false;
            }
        }

        function 
unhighlight(s) {
            if (
s == null) {
                
highlights = [];
                
plot.triggerRedrawOverlay();
            }

            
//if (typeof s == "number") {
            //    s = series[s];
            //}

            
var i = indexOfHighlight(s);

            if (
i != -1) {
                
highlights.splice(i, 1);
                
plot.triggerRedrawOverlay();
            }
        }

        function 
indexOfHighlight(s) {
            for (var 
i = 0; i < highlights.length; ++i) {
                var 
h = highlights[i];
                if (
h.series == s)
                    return 
i;
            }
            return -
1;
        }

        function 
drawOverlay(plot, octx) {

            var 
options = plot.getOptions();

            var 
radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;

            
octx.save();
            
octx.translate(centerLeft, centerTop);
            
octx.scale(1, options.series.pie.tilt);

            for (var 
i = 0; i < highlights.length; ++i) {
                
drawHighlight(highlights[i].series);
            }

            
drawDonutHole(octx);

            
octx.restore();

            function 
drawHighlight(series) {

                if (
series.angle <= 0 || isNaN(series.angle)) {
                    return;
                }

                
//octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();
                
octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor
                
octx.beginPath();
                if (
Math.abs(series.angle - Math.PI * 2) > 0.000000001) {
                    
octx.moveTo(0, 0); // Center of the pie
                
}
                
octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);
                
octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);
                
octx.closePath();
                
octx.fill();
            }
        }
    } 
// end init (plugin body)

    // define pie specific options and their default values

    
var options = {
        
series: {
            
pie: {
                
show: false,
                
radius: "auto",    // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)
                
innerRadius: 0, /* for donut */
                
startAngle: 3 / 2,
                
tilt: 1,
                
shadow: {
                    
left: 5,    // shadow left offset
                    
top: 15,    // shadow top offset
                    
alpha: 0.02    // shadow alpha
                
},
                
offset: {
                    
top: 0,
                    
left: "auto"
                
},
                
stroke: {
                    
color: "#fff",
                    
width: 1
                
},
                
label: {
                    
show: "auto",
                    
formatter: function (label, slice) {
                        return 
"<div style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + ";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>";
                    },    
// formatter function
                    
radius: 1,    // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)
                    
background: {
                        
color: null,
                        
opacity: 0
                    
},
                    
threshold: 0    // percentage at which to hide the label (i.e. the slice is too narrow)
                
},
                
combine: {
                    
threshold: -1,    // percentage at which to combine little slices into one larger slice
                    
color: null,    // color to give the new slice (auto-generated if null)
                    
label: "Other"    // label to give the new slice
                
},
                
highlight: {
                    
//color: "#fff",        // will add this functionality once parseColor is available
                    
opacity: 0.5
                
}
            }
        }
    };

    $.
plot.plugins.push({
        
init: init,
        
options: options,
        
name: "pie",
        
version: "1.1"
    
});

})(
jQuery);
?>
Онлайн: 2
Реклама