Version 3.18.1
Show:

File: charts/js/Histogram.js

            /**
             * Provides core functionality for creating a bar or column series.
             *
             * @module charts
             * @submodule series-histogram
             */
            var Y_Lang = Y.Lang;
            
            /**
             * Histogram is the base class for Column and Bar series.
             *
             * @class Histogram
             * @constructor
             * @param {Object} config (optional) Configuration parameters.
             * @submodule series-histogram
             */
            function Histogram(){}
            
            Histogram.prototype = {
                /**
                 * Draws the series.
                 *
                 * @method drawSeries
                 * @protected
                 */
                drawSeries: function()
                {
                    if(this.get("xcoords").length < 1)
                    {
                        return;
                    }
                    var style = this._copyObject(this.get("styles").marker),
                        graphic = this.get("graphic"),
                        setSize,
                        calculatedSize,
                        xcoords = this.get("xcoords"),
                        ycoords = this.get("ycoords"),
                        i = 0,
                        len = xcoords.length,
                        top = ycoords[0],
                        seriesTypeCollection = this.get("seriesTypeCollection"),
                        seriesLen = seriesTypeCollection ? seriesTypeCollection.length : 0,
                        seriesSize = 0,
                        totalSize = 0,
                        offset = 0,
                        ratio,
                        renderer,
                        order = this.get("order"),
                        graphOrder = this.get("graphOrder"),
                        left,
                        marker,
                        setSizeKey,
                        calculatedSizeKey,
                        config,
                        fillColors = null,
                        borderColors = null,
                        xMarkerPlane = [],
                        yMarkerPlane = [],
                        xMarkerPlaneLeft,
                        xMarkerPlaneRight,
                        yMarkerPlaneTop,
                        yMarkerPlaneBottom,
                        dimensions = {
                            width: [],
                            height: []
                        },
                        xvalues = [],
                        yvalues = [],
                        groupMarkers = this.get("groupMarkers");
                    if(Y_Lang.isArray(style.fill.color))
                    {
                        fillColors = style.fill.color.concat();
                    }
                    if(Y_Lang.isArray(style.border.color))
                    {
                        borderColors = style.border.color.concat();
                    }
                    if(this.get("direction") === "vertical")
                    {
                        setSizeKey = "height";
                        calculatedSizeKey = "width";
                    }
                    else
                    {
                        setSizeKey = "width";
                        calculatedSizeKey = "height";
                    }
                    setSize = style[setSizeKey];
                    calculatedSize = style[calculatedSizeKey];
                    this._createMarkerCache();
                    this._maxSize = graphic.get(setSizeKey);
                    if(seriesTypeCollection && seriesLen > 1)
                    {
                        for(; i < seriesLen; ++i)
                        {
                            renderer = seriesTypeCollection[i];
                            seriesSize += renderer.get("styles").marker[setSizeKey];
                            if(order > i)
                            {
                                offset = seriesSize;
                            }
                        }
                        totalSize = len * seriesSize;
                        if(totalSize > this._maxSize)
                        {
                            ratio = graphic.get(setSizeKey)/totalSize;
                            seriesSize *= ratio;
                            offset *= ratio;
                            setSize *= ratio;
                            setSize = Math.max(setSize, 1);
                            this._maxSize = setSize;
                        }
                    }
                    else
                    {
                        seriesSize = style[setSizeKey];
                        totalSize = len * seriesSize;
                        if(totalSize > this._maxSize)
                        {
                            seriesSize = this._maxSize/len;
                            this._maxSize = seriesSize;
                        }
                    }
                    offset -= seriesSize/2;
                    for(i = 0; i < len; ++i)
                    {
                        xMarkerPlaneLeft = xcoords[i] - seriesSize/2;
                        xMarkerPlaneRight = xMarkerPlaneLeft + seriesSize;
                        yMarkerPlaneTop = ycoords[i] - seriesSize/2;
                        yMarkerPlaneBottom = yMarkerPlaneTop + seriesSize;
                        xMarkerPlane.push({start: xMarkerPlaneLeft, end: xMarkerPlaneRight});
                        yMarkerPlane.push({start: yMarkerPlaneTop, end: yMarkerPlaneBottom});
                        if(!groupMarkers && (isNaN(xcoords[i]) || isNaN(ycoords[i])))
                        {
                            this._markers.push(null);
                            continue;
                        }
                        config = this._getMarkerDimensions(xcoords[i], ycoords[i], calculatedSize, offset);
                        if(!isNaN(config.calculatedSize) && config.calculatedSize > 0)
                        {
                            top = config.top;
                            left = config.left;
            
                            if(groupMarkers)
                            {
                                dimensions[setSizeKey][i] = setSize;
                                dimensions[calculatedSizeKey][i] = config.calculatedSize;
                                xvalues.push(left);
                                yvalues.push(top);
                            }
                            else
                            {
                                style[setSizeKey] = setSize;
                                style[calculatedSizeKey] = config.calculatedSize;
                                style.x = left;
                                style.y = top;
                                if(fillColors)
                                {
                                    style.fill.color = fillColors[i % fillColors.length];
                                }
                                if(borderColors)
                                {
                                    style.border.color = borderColors[i % borderColors.length];
                                }
                                marker = this.getMarker(style, graphOrder, i);
                            }
            
                        }
                        else if(!groupMarkers)
                        {
                            this._markers.push(null);
                        }
                    }
                    this.set("xMarkerPlane", xMarkerPlane);
                    this.set("yMarkerPlane", yMarkerPlane);
                    if(groupMarkers)
                    {
                        this._createGroupMarker({
                            fill: style.fill,
                            border: style.border,
                            dimensions: dimensions,
                            xvalues: xvalues,
                            yvalues: yvalues,
                            shape: style.shape
                        });
                    }
                    else
                    {
                        this._clearMarkerCache();
                    }
                },
            
                /**
                 * Collection of default colors used for marker fills in a series when not specified by user.
                 *
                 * @property _defaultFillColors
                 * @type Array
                 * @protected
                 */
                _defaultFillColors: ["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"],
            
                /**
                 * Gets the default style values for the markers.
                 *
                 * @method _getPlotDefaults
                 * @return Object
                 * @private
                 */
                _getPlotDefaults: function()
                {
                    var defs = {
                        fill:{
                            type: "solid",
                            alpha: 1,
                            colors:null,
                            alphas: null,
                            ratios: null
                        },
                        border:{
                            weight: 0,
                            alpha: 1
                        },
                        width: 12,
                        height: 12,
                        shape: "rect",
            
                        padding:{
                            top: 0,
                            left: 0,
                            right: 0,
                            bottom: 0
                        }
                    };
                    defs.fill.color = this._getDefaultColor(this.get("graphOrder"), "fill");
                    defs.border.color = this._getDefaultColor(this.get("graphOrder"), "border");
                    return defs;
                }
            };
            
            Y.Histogram = Histogram;