从 plt.hexbin 获取信息

Get information from plt.hexbin

我一直在使用 hexbing 来尝试改进 SPCF 方法,因此我需要从图中获取信息来修改数据,然后用新值重新绘制它。

我需要修改以重新绘制的最重要数据是每个单元格的点数和该网格单元格的 C 值。

有什么办法可以得到这样的数据?

matplotlib.pyplot.hexbin returns a PolyCollection 对象,其方法 get_offsetsget_array 提供了您正在寻找的内容。来自 hexbin 文档:

Returns: PolyCollection
A PolyCollection defining the hexagonal bins.

If marginals is True, horizontal bar and vertical bar (both PolyCollections) will be attached to the return collection as attributes hbar and vbar.

例子

例如,我将创建一个简单的 hexbin 图并获取 plt.hexbin:

返回的 PolyCollection 对象
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)

您可以浏览集合对象并获取 get_offsets()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,)

您可以随心所欲地操作这些数组,然后使用 x、y 和 C hexbin 的计数参数再次绘制它们。如果您不更改偏移量和 arr 的值,这将绘制完全相同的图像:

In [30]: plt.hexbin(offsets[:, 0], offsets[:, 1], C=arr, gridsize=20)