Python 以直方图/六角图的形式绘制二维箱中分散值的平均值

Python 以直方图/六角图的形式绘制二维箱中分散值的平均值,python,matplotlib,Python,Matplotlib,我有三维散乱数据x,y,z。 我想将x和y的容器中z的平均值绘制为十六进制图或2D直方图图。 是否有任何matplotlib函数可以执行此操作? 我只能提出一些非常麻烦的实现,尽管这似乎是一个常见的问题 例如,类似这样的事情: 除了颜色应该取决于(x,y)bin的平均z值(而不是默认的hexplot/2D直方图功能中的(x,y)bin中的条目数)。如果binning是您所要求的,那么bined\u statistic\u 2D可能适合您。下面是一个例子: from scipy.stats im

我有三维散乱数据x,y,z。 我想将x和y的容器中z的平均值绘制为十六进制图或2D直方图图。 是否有任何matplotlib函数可以执行此操作? 我只能提出一些非常麻烦的实现,尽管这似乎是一个常见的问题

例如,类似这样的事情:


除了颜色应该取决于(x,y)bin的平均z值(而不是默认的hexplot/2D直方图功能中的(x,y)bin中的条目数)。

如果binning是您所要求的,那么
bined\u statistic\u 2D
可能适合您。下面是一个例子:

from scipy.stats import binned_statistic_2d
import numpy as np

x = np.random.uniform(0, 10, 1000)
y = np.random.uniform(10, 20, 1000)
z = np.exp(-(x-3)**2/5 - (y-18)**2/5) + np.random.random(1000)

x_bins = np.linspace(0, 10, 10)
y_bins = np.linspace(10, 20, 10)

ret = binned_statistic_2d(x, y, z, statistic=np.mean, bins=[x_bins, y_bins])

fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(12, 4))
ax0.scatter(x, y, c=z)
ax1.imshow(ret.statistic.T, origin='bottom', extent=(0, 10, 10, 20))

@Andrea的回答非常清楚,也很有帮助,但我想提一个更快的替代方案,它不使用scipy库

其思想是通过z变量(每个箱子中有z变量的总和)对x和y进行加权,然后根据直方图进行归一化,而不使用权重(每个箱子中有计数的数量)。这样,您将计算每个箱子中z变量的平均值

守则:

将numpy导入为np
将matplotlib.pyplot作为plt导入
x=np.随机.均匀(0,10,10**7)
y=np.随机均匀(10,20,10**7)
z=np.exp(-(x-3)**2/5-(y-18)**2/5)+np.random.random(10**7)
x_bins=np.linspace(0,10,50)
y_bins=np.linspace(10,20,50)
H、 xedges,yedges=np.histogram2d(x,y,bins=[x_bins,y_bins],权重=z)
H_计数,xedges,yedges=np.Historogram2d(x,y,bins=[x_bins,y_bins])
H=H/H_计数
plt.imshow(H.T,原点为低,cmap为RdBu,
范围=[xedges[0],xedges[-1],yedges[0],yedges[-1]]
plt.colorbar()


在我的电脑中,这种方法比使用scipy的
binned_statistic_2d

快约5倍。请查看matplotlib
tricontour
函数谢谢您的建议。然而,我想在(x,y)空间进行三角测量(我觉得在我几乎没有数据的地方,这很难解释)。虽然已经实现了,但这似乎是一个比我感兴趣的更难的问题。