In matplotlib's plotting lexicon, i think you want a "hexbin". If you're not familiar with hexbin, it's just a bivariate histogram in which the xy plane is tessellated by a regular grid of hexagons. Once you've done that, you can just count the number of points falling in each hexagon, map some value windows to colors, and you've got a hexbin diagram. (The choice of hexagon as the bin geometry is intuitive--hexagons have nearest-neighbor symmetry (e.g., square bins don't) and hexagon is the highest n-polygon that gives regular plane tessellation).
You want a 'heat map' from x, y data, so:
from matplotlib import pyplot as PLT
from matplotlib import cm as CM
from matplotlib import mlab as ML
import numpy as NP
n = 1e5
x = y = NP.linspace(-5, 5, 100)
X, Y = NP.meshgrid(x, y)
Z1 = ML.bivariate_normal(X, Y, 2, 2, 0, 0)
Z2 = ML.bivariate_normal(X, Y, 4, 1, 1, 1)
ZD = Z2 - Z1
x = X.ravel()
y = Y.ravel()
z = ZD.ravel()
gridsize=30
PLT.subplot(111)
# if "bins=None", then color of each hexagon corresponds directly to its count
# "C" is optional--it maps values to x, y coordinates; if C is None (default) then
# the result is a pure 2D histogram
PLT.hexbin(x, y, C=z, gridsize=gridsize, cmap=CM.jet, bins=None)
PLT.axis([x.min(), x.max(), y.min(), y.max()])
cb = PLT.colorbar()
cb.set_label('mean value')
PLT.show()