Use pandas create bins for stat_bin2d

- Although this is cleaner than the previous implementation, it turns
  out the real performance bottleneck is the plotting function for
  geom_rect -- ax.bar(). It is not meant to draw many small
  rectangles. The solution will be to use ax.fill_between for geom_rect