I have been using hexbing to try to improve the SPCF method, so for that I would need to get information from the plot to modify the data and then replot it with the new values.
The most important data I need to modify to replot is the number of points per cell and the C value of that grid cell.
Any way I can get such data?
Advertisement
Answer
matplotlib.pyplot.hexbin
returns a PolyCollection
object with methods get_offsets
and get_array
which provide exactly what you’re looking for. From the hexbin docs:
Returns:
PolyCollection
A PolyCollection defining the hexagonal bins.
PolyCollection.get_offsets
contains a Mx2 array containing the x, y positions of the M hexagon centers.PolyCollection.get_array
contains the values of the M hexagons.If marginals is True, horizontal bar and vertical bar (both PolyCollections) will be attached to the return collection as attributes hbar and vbar.
Example
As an example, I’ll create a simple hexbin plot and grab the PolyCollection
object returned by plt.hexbin
:
In [2]: x = np.linspace(1, 20, 500)
In [3]: y = np.log(x) + np.random.random(size=500) - 0.5
In [4]: coll = plt.hexbin(x, y, gridsize=20)
You can explore the collection object and grab the arrays returned by get_offsets()
and get_array()
:
In [23]: type(coll)
Out[23]: matplotlib.collections.PolyCollection
In [24]: offsets = coll.get_offsets()
In [25]: offsets
Out[25]:
array([[ 9.99999981e-01, -3.48964611e-01],
[ 9.99999981e-01, -3.91102264e-03],
[ 9.99999981e-01, 3.41142565e-01],
[ 1.95250000e+01, 2.58399089e+00],
[ 1.95250000e+01, 2.92904448e+00],
[ 1.95250000e+01, 3.27409806e+00]])
In [26]: arr = coll.get_array()
In [27]: arr
Out[27]:
masked_array(data=[ 2., 4., 0., , 7., 2., 4.],
mask=False,
fill_value=1e+20)
In [28]: offsets.shape
Out[28]: (472, 2)
In [29]: arr.shape
Out[29]: (472,)
You could manipulate these arrays however you want, and then plot them again using the x, y, and C
count argument to hexbin. If you don’t change the values of offsets and arr, this plots the exact same image:
In [30]: plt.hexbin(offsets[:, 0], offsets[:, 1], C=arr, gridsize=20)