Python Matplotlib rectangular binning
Question: I've got a series of (x,y) values that I want to plot a 2d histogram of using
python's matplotlib. Using hexbin, I get something like this: ![alt
text](http://img121.imageshack.us/img121/1339/hexbin.png) But I'm looking for
something like this: ![alt
text](http://img17.imageshack.us/img17/1927/recthist.png) Example Code:

    
    
    from matplotlib import pyplot as plt
    import random
    
    foo = lambda : random.gauss(0.0,1.0)
    
    x = [foo() for i in xrange(5000)]
    y = [foo() for i in xrange(5000)]
    
    pairs = zip(x,y)
    
    #using hexbin I supply the x,y series and it does the binning for me
    hexfig = plt.figure()
    hexplt = hexfig.add_subplot(1,1,1)
    hexplt.hexbin(x, y, gridsize = 20)
    
    #to use imshow I have to bin the data myself
    def histBin(pairsData,xbins,ybins=None):
        if (ybins == None): ybins = xbins
        xdata, ydata = zip(*pairsData)
        xmin,xmax = min(xdata),max(xdata)
        xwidth = xmax-xmin
        ymin,ymax = min(ydata),max(ydata)
        ywidth = ymax-ymin
        def xbin(xval):
            xbin = int(xbins*(xval-xmin)/xwidth)
            return max(min(xbin,xbins-1),0)
        def ybin(yval):
            ybin = int(ybins*(yval-ymin)/ywidth)
            return max(min(ybin,ybins-1),0)
        hist = [[0 for x in xrange(xbins)] for y in xrange(ybins)]
        for x,y in pairsData:
            hist[ybin(y)][xbin(x)] += 1
        extent = (xmin,xmax,ymin,ymax)
        return hist,extent
    
    #plot using imshow
    imdata,extent = histBin(pairs,20)
    imfig = plt.figure()
    implt = imfig.add_subplot(1,1,1)
    implt.imshow(imdata,extent = extent, interpolation = 'nearest')
    
    plt.draw()
    plt.show()
    

It seems like there should already be a way to do this without writing my own
"binning" method and using imshow.


Answer: Numpy has a function called
[histogram2d](http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram2d.html),
whose docstring also shows you how to visualize it using Matplotlib. Add
`interpolation=nearest` to the imshow call to disable the interpolation.

