yhat/ggplot — pull request #327 by arnfred (2014-06-14 06:03:28+00:00)
Title: Legend rework

## Rework of legend

As shown in yhat#304 and yhat#89 the current legend is drawn once per aesthetic (outside of x and y). This behaviour creates duplicate information when we use for example color and fill along the
same variable.

I've reworked the legend to group information per variable and display for example one line showing both shape, color and alpha information. The reworked legend also address: yhat#273.

### New Features
- Group legend information per variable
- Implement alpha
- Better position legend (The vertical position was centered according to the top of the frame before)
- Fixed issue with legend overlapping
- Fixed problem with legend inventing numeric values. For numeric columns with less than 5 unique values, the current legend would interpolate them to write 5 continuous values

### Things that doesn't work:
- No custom rearrangement (say, making swapping line 1 and 2 in the legend)
- Legend might be longer than plot. Currently it breaks in to two columns, but if the plot is drawn smaller then I can't see a way to adjust the legend to this behaviour

### Changes:
- I've personally had the problem that the legend would interpolate between numeric values even when there were less than 5 unique values in the data. I've changed this behaviour so the legend puts a label for every value when there are less than 8. Currently the color scheme in this case is discrete, but I'm not convinced this is the best solution. I generally think distinguishing between discrete and continuous data types makes sense, but for some continuous cases we might want to use the set of values that are present in the data instead of interpolating. I'm unsure whether the way I've changed this is the right way to do it, so I welcome comments on this matter.
- For the labels to be consistent across groups I had to make sure they were calculated in one place instead of across different files (```components/colors.py```, ```components/alphas.py```, ```components/sizes.py``` etc) as it's currently done. To do so I've added a function called ```get_labels``` to ```components/legend.py``` and call it from the respective files. I think this counts as a work around and potentially a refactoring of the codebase would eliminate the need for a ```get_labels``` function, but currently I don't see any other obvious way of doing it.

### Examples
![legend_alpha](https://cloud.githubusercontent.com/assets/1090038/3277679/76dfd8d2-f389-11e3-9eb4-6777a32672ad.png)
![legend_alpha_rect](https://cloud.githubusercontent.com/assets/1090038/3277680/76e0e3a8-f389-11e3-9f15-f4e650842722.png)
![legend_linetype](https://cloud.githubusercontent.com/assets/1090038/3277678/76df5998-f389-11e3-9a71-a2ee90baa058.png)