seaborn和panda都提供API,以便将二元直方图绘制为hexbin图(示例如下所示)。但是,我正在搜索执行查询以查找位于相同hexbin中的点。是否具有检索与hexbin中的数据点关联的行的功能?
举一个例子:
我的数据框包含3行:A
,B
和C
。我使用sns.jointplot(x=A,y=B)
绘制密度。现在,我想对位于同一bin中的每个数据点执行查询。例如,对于每个bin,计算与每个点关联的C
值的平均值。
答案 0 :(得分:1)
当前解决方案-快速破解
当前,我已经实现了以下函数,以将函数应用于与位于同一十六进制中的(x,y)坐标关联的数据:
def hexagonify(x, y, values, func=None):
hexagonized_list = []
fig = plt.figure()
fig.set_visible(False)
if func is not None:
image = plt.hexbin(x=x, y=y, C=values, reduce_C_function=func)
else:
image = plt.hexbin(x=x, y=y, C=values)
values = image.get_array()
verts = image.get_offsets()
for offc in range(verts.shape[0]):
binx, biny = verts[offc][0], verts[offc][1]
val = values[offc]
if val:
hexagonized_list.append((binx, biny, val))
fig.clear()
plt.close(fig)
return hexagonized_list
值(与x或y大小相同)通过values
参数传递。六边形是通过hexbin
的{{1}}函数来计算的。通过返回的matplotlib
的{{1}}函数检索值。默认情况下,get_array()
函数将应用于每个bin的累积值。可以通过为PolyCollection
参数提供功能来更改此功能。随后,np.mean
方法使我们能够计算垃圾箱(discussed here)的中心。这样,我们可以关联(默认情况下)每个十六进制提供的值的平均值。但是,此解决方案是一个hack,因此欢迎对该解决方案进行任何改进。
答案 1 :(得分:0)
matplotlib
如果您已经绘制了图,则可以从matplotlib
返回的polycollection
中获取Bin Counts:
polycollection:一个PolyCollection实例;在此使用PolyCollection.get_array来获取每个六边形的计数。
此功能在以下位置也可用:
pandas
这里仅使用pandas
可以处理C
属性的MCVE:
import numpy as np
import pandas as pd
# Trial Dataset:
N=1000
d = np.array([np.random.randn(N), np.random.randn(N), np.random.rand(N)]).T
df = pd.DataFrame(d, columns=['x', 'y', 'c'])
# Create bins:
df['xb'] = pd.cut(df.x, 3)
df['yb'] = pd.cut(df.y, 3)
# Group by and Aggregate:
p = df.groupby(['xb', 'yb']).agg('mean')['c']
p.unstack()
首先,我们使用pandas.cut
创建垃圾箱。然后我们group by and aggregate。您可以选择要聚合agg
的{{1}}函数(例如C
,max
等)。
输出大约是:
median