package flare.scale {
import flare.util.Maths;
import flare.util.Strings;
/**
* Scale that organizes data into discrete bins by quantiles.
* For example, the quantile scale can be used to create a discrete size
* encoding by statistically dividing the data into bins. Quantiles are
* computed using the flare.util.Maths.quantile
method.
*
* @see flare.util.Maths#quantile
*/
public class QuantileScale extends Scale
{
private var _quantiles:Vector.;
/** @inheritDoc */
public override function get flush():Boolean { return true; }
public override function set flush(val:Boolean):void { /* nothing */ }
/** @inheritDoc */
public override function get min():Object { return _quantiles[0]; }
/** @inheritDoc */
public override function get max():Object { return _quantiles[_quantiles.length-1]; }
// --------------------------------------------------------------------
/**
* Creates a new QuantileScale.
* @param n the number of quantiles desired
* @param values the data values to be organized into quantiles
* @param sorted flag indicating if the input values vector is
* already pre-sorted
* @param labelFormat the formatting pattern for value labels
*/
public function QuantileScale(n:int, values:Vector.,
sorted:Boolean=false, labelFormat:String=Strings.DEFAULT_NUMBER)
{
_quantiles = (n<0 ? values : Maths.quantile(n, values, !sorted));
this.labelFormat = labelFormat;
}
/** @inheritDoc */
public override function get scaleType():String {
return ScaleType.QUANTILE;
}
/** @inheritDoc */
public override function clone():Scale
{
return new QuantileScale(-1, _quantiles, false, _format);
}
/** @inheritDoc */
public override function interpolate(value:Object):Number
{
return Maths.invQuantileInterp(Number(value), _quantiles);
}
/** @inheritDoc */
public override function lookup(f:Number):Object
{
return Maths.quantileInterp(f, _quantiles);
}
/** @inheritDoc */
public override function values(num:int=-1):/*Number*/Vector.
{
var a:Vector. = new Vector.();
var stride:int = num<0 ? 1 :
int(Math.max(1, Math.floor(_quantiles.length/num)));
for (var i:uint=0; i<_quantiles.length; i += stride) {
a.push(_quantiles[i]);
}
return a;
}
} // end of class QuantileScale
}