``````public auto statFunction(FUNC, T)(
FUNC func,
T min,
T max,
size_t precision = 50)
if(isCallable!FUNC)
``````

Create Aes based on a function

## Parameters

 func Function min x coordinate to start from max x coordinate to end at precision Number of points to calculate

## Examples

``````    /// http://blackedder.github.io/ggplotd/images/function.png
import std.random : uniform;
import std.typecons : Tuple; import ggplotd.stat : statFunction;
import ggplotd.ggplotd : GGPlotD;
import ggplotd.geom : geomLine, geomPoint;
import ggplotd.range : mergeRange;

auto f = (double x) { return x / (1 + x); };

auto aes = statFunction(f, 0.0, 10);
auto gg = GGPlotD().put(geomLine(aes));

// Generate some noisy points
auto f2 = (double x) { return x / (1 + x) * uniform(0.75, 1.25); };
auto aes2 = f2.statFunction(0.0, 10, 25);

// Show points in different colour
auto withColour = Tuple!(string, "colour")("aquamarine").mergeRange(aes2);
gg = gg.put(withColour.geomPoint);

gg.save("function.png");
``````
``````private auto binID(T)(
T value,
T min,
T max,
T width)
``````

Binning

``````public auto statHist(AES)(
AES aesRaw,
size_t noBins = 0)
``````

Create Aes that specifies the bins to draw an histogram

## Parameters

 aesRaw Data that the histogram will be based on noBins Optional number of bins. On a value of 0 the number of bins will be chosen automatically.

## Returns

Range that holds rectangles representing different bins

``````public auto statHist2D(AES)(
AES aesRange,
size_t noBinsX = 0,
size_t noBinsY = 0)
``````

Create Aes that specifies the bins to draw an histogram

## Parameters

 aesRange Data that the histogram will be based on noBinsX Optional number of bins for x axis. On a value of 0 the number of bins will be chosen automatically. noBinsY Optional number of bins for y axis. On a value of 0 the number of bins will be chosen automatically.

## Returns

Range that holds rectangles representing different bins

``````public auto statDensity(AES)(AES aesRange)
``````

Calculate kernel density for given data

## Parameters

 aesRange Data that the histogram will be based on

## Returns

InputRange that holds x and y coordinates for the kernel

## Example

``````import std.stdio : writeln;
import std.algorithm : map;
import std.array : array;
import std.random : uniform;
import std.range : chain, iota, repeat, walkLength;

import ggplotd.aes : Aes;

auto xs = iota(0,100,1)
.map!((i)=>uniform(0,0.75)+uniform(0.25,1))
.array;

auto dens = statDensity( Aes!( typeof(xs), "x")( xs ) );
auto dim = dens.walkLength;
assertGreaterThan( dim, 1 );

// Test that grouping leads to longer (twice as long) result
auto cols = chain("a".repeat(50),"b".repeat(50) );
auto dens2 = statDensity( Aes!(typeof(cols), "colour", typeof(xs), "x")( cols, xs ) );
assertGreaterThan( dens2.walkLength, 1.9*dim );
assertLessThan( dens2.walkLength, 2.1*dim );

// Test that colour is passed through (merged)
assertEqual( dens2.front.colour.length, 1 );

// Test single point
xs = ;
dens = statDensity( Aes!( typeof(xs), "x")( xs ) );
assertEqual(dens.walkLength, 3);

``````
``````public auto statDensity2D(AES)(AES aesRange)
``````

Calculate kernel density for given x and y data

## Parameters

 aesRange Data that the histogram will be based on

## Returns

Range of ranges that holds polygons for the kernel

## Example

``````import std.algorithm : map;
import std.array : array;
import std.random : uniform;
import std.range : iota, walkLength;

import ggplotd.aes : Aes;
auto xs = iota(0,500,1).map!((x) => uniform(0.0,5)+uniform(0.0,5))
.array;
auto ys = iota(0,500,1).map!((y) => uniform(1.0,1.5)+uniform(1.0,1.5))
.array;
auto aes = Aes!(typeof(xs), "x", typeof(ys), "y")( xs, ys);

auto sD = statDensity2D( aes );
assertGreaterThan( sD.walkLength, 1150 );
assertLessThan( sD.walkLength, 1450 );
assertEqual( sD.front.walkLength, 3 );

// One value
xs = ;
ys = ;
aes = Aes!(typeof(xs), "x", typeof(ys), "y")( xs, ys);

sD = statDensity2D( aes );
assertGreaterThan(sD.walkLength, 0);

``````

## Functions

 autostatFunction Create Aes based on a function private, autobinID Binning autostatHist Create Aes that specifies the bins to draw an histogram autostatHist2D Create Aes that specifies the bins to draw an histogram autostatDensity Calculate kernel density for given data autostatDensity2D Calculate kernel density for given x and y data