Modifying matplotlib's hexbin to scale hexes
30 Mar 2013When showing radiation data with matplotlib's hexplot I wanted to somehow include also statistical uncertainties. I didn't see any solution with standard functionality but I came up with a simple modification to make hexes with large uncertainties smaller.
Actual scaling of the hexes is done by these few lines (polygons in matplotlib are just arrays of vertices):
# scale all polygons
new_polygons = []
for vs, cnts in zip(polygons, accum_hexscale):
xs, ys = vs.T
mx = mean(xs)
my = mean(ys)
sc = hexscale(cnts)
xs = (xs - mx) * sc + mx
ys = (ys - my) * sc + my
new_polygons.append(zip(xs, ys))
polygons = new_polygons
My modification can actually scale hexes with an arbitrary function of bin counts. And if you provide C
parameter reduce_C_function
can be separately set for scaling. If you want to just scale hexes according to counts in each bin you can use arctan
to restrict scaling to [0,1):
from pylab import *
from hexbin2 import hexbin2
x = randn(9000)
y = randn(9000) / 2
hexbin2(x, y, hexscale=lambda x: arctan(x/5) * 2. / pi)
Which produces a plot like this:
For radiation data I want the hex color to indicate an average radiation in bin's area so reduce_C_function
is set to mean
. On the other hand, uncertainty of measurement is square root of total counts in bin's area, so hexbin_reduce_C_function
is set to sum
.
Full code prepared as a separate module: https://gist.github.com/anonymous/5278510