Some tests
Add panel and facets

- Introduce plot_build routine that where all the parts of the plot
  are assembled.
Clean up ggplot, add layer, ... run stuff

- Clean up and run plot_build to see how it is working out.
Compute aesthetics
plot_build - Add group
Fix deepcopy and facets

- For geom, stat and layer do not copy the data
- Override the previous faceting implementation
pd.Categorical sorting and train position

- Get the categoricals to sort properly -- making use
  of Pandas upstream bug fixes
- Implement position scale training
Add margins

- Port add_margins from reshape::add_margins
  and tests
Map position, ninteraction

- Map positions scales and deal with scale limits
- Change dataframe_id to ninteraction and reimplement it
  numerically like plyr::id
- Get rid of a bunch of super() calls as they break when
  ggplot is reloaded(key in developing with ipython notebook).
- Clean up the position scales with intermediate
  base classes that handle special cases.
- implement utils.utils.censor
- fix stat.__radd__, how the layer is added. (It is still not
  clean enough)
Add calculate_stats to the plot pipepline

- Plus layer.calc_statistic, stat._calculate_groups
- Fix stat_bin._calculate to make use of the range
- Add range related scale.* $ utility methods
- Split waiver() into a setter and a checker (is_waive())
- some tests
Add map_statistic to the plot pipeline

- Include support for any computed stats
- Reset index for the data that moves through the plotline
- various np.asarray tweaks where necessary
- fix scales.input() to flatten the lists of aesthetics
Add reprameterisation to the plot pipeline

- Implement geom_bar.reparameterise
- Split geom_area and geom_ribbon
- Port resolution() from R
Add adjust_position to the plot pipeline

- position baseclass, position_jitter and stabs for other
  position classes
- gg_import utility function
- change some global ggplot.* imports to relative imports
Implement the position classes that use 'collide'

- positions dodge, stack, fill and jitterdodge

- capture the enviroment of the `ggplot()` call instead
  the `aes()`. There is potential more than one `aes()`
  which leads to a mix up because of aesthetic overrideing

- `layer.compute_aesthetics` now does the transforms

- fix the `range` and `limit()` of the discrete position scales.
  scale ranges are either of type list for discrete scales or
  ndarray for continuous scales. Discrete position scales can
  tell which training was done based on range type, incontrast
  ggplot2 introduces a different name `range_c`

- `pd.pivot_table` depracation of `rows`

- gg_warning utility function to print the warning messages

- remove_missing utility function, it will be used in a number
  of places
Reset scales and train positions again

- Had to adopt the second range for discrete position scales,
  and all ranges are lists.
Train non positions scales and panels ranges

- Train and map non position scales
- Calculate the x & y ranges for each panel
- Fix calls to ninteraction. They used the old call signature
Stats learned to use trained scales

- Get `stats` to use the x & y scale dimensions
- `stats` let calculate_groups do the putting together of the data
- stat_bin2d is now functional
- pd.isnull is friendlier than np.isnan <- freaks out on strings
- cleanup some more global imports
- geoms learned layer_params
Remove old scale code