NumPy histogram2d 具有旋转的非正交分格网格
NumPy histogram2d with a rotated, non-orthogonal binning grid
我需要计算(并绘制)一个 histogram2d
但我的装箱网格是旋转的并且也是非正交的。
这样做的一种方法是对我的数据应用转换,以便我将其放入笛卡尔系统,计算我的 histogram2d
,然后应用逆变换。
如果没有这种开销转换,可以直接完成吗?
我想我的问题是:在这种情况下如何为 histogram2d
定义 bins
? (据我所知,histogram2d
将只接受 x 和 y 对齐 bins
)
我的数据是 2 个巨大的点列表(每个点 10k~100k),其坐标在笛卡尔坐标系中给出(实际上是投影 CRS,因为这些是真实世界的位置)但它们组织在不与 X 轴和 Y 轴(旋转)对齐的规则网格,可能正交也可能不正交。合并网格将从中派生,因此它将是一个(旋转的)规则四边形网格。
我看到 matplotlib
有一个 QuadMesh
对象 (see here) 所以我满怀希望,但我不确定如何在 [=18= 中处理它].
基本上这就是我想要实现的目标:
经过一些测试,我得出的结论是,将坐标转换为笛卡尔网格以计算直方图并返回绘图的开销是可以接受的。 NumPy
中的矩阵运算相当高效,我可以在不到 7 秒的时间内处理 115+ 百万个点。
然而,"back"部分可以由Matplotlib
直接用matplotlib.transforms
处理。
pcolormesh
、hist2d
和 imshow
都接受 transform
关键字,可用于将笛卡尔数据绘制到所需的坐标中,如下所示:
# set I, J, bins (in the Cartesian system) and cmap
# a, b, c, d, e, f are values of the transformation matrix
transform = matplotlib.transforms.Affine2D.from_values(a, b, c, f, d, e, f)
fig, ax = plt.subplots(figsize=figsize)
_, _, _, im = ax.hist2d(I, J, bins=bins, cmap=cmap, transform=transform + ax.transData)
fig.colorbar(im)
ax.autoscale()
它并不比用 NumPy
处理 "back" 转换快多少,但它可以使代码更轻,因为它只需要 1 个额外的行和 1 个额外的关键字。
imshow
可能有点麻烦,因为它在使用 ax.autoscale()
后不会更新显示范围,并且它将坐标作为图像或矩阵处理,因此必须相应地调整 transform
。由于这些原因,我更喜欢 hist2d
。
参考文献:
我需要计算(并绘制)一个 histogram2d
但我的装箱网格是旋转的并且也是非正交的。
这样做的一种方法是对我的数据应用转换,以便我将其放入笛卡尔系统,计算我的 histogram2d
,然后应用逆变换。
如果没有这种开销转换,可以直接完成吗?
我想我的问题是:在这种情况下如何为 histogram2d
定义 bins
? (据我所知,histogram2d
将只接受 x 和 y 对齐 bins
)
我的数据是 2 个巨大的点列表(每个点 10k~100k),其坐标在笛卡尔坐标系中给出(实际上是投影 CRS,因为这些是真实世界的位置)但它们组织在不与 X 轴和 Y 轴(旋转)对齐的规则网格,可能正交也可能不正交。合并网格将从中派生,因此它将是一个(旋转的)规则四边形网格。
我看到 matplotlib
有一个 QuadMesh
对象 (see here) 所以我满怀希望,但我不确定如何在 [=18= 中处理它].
基本上这就是我想要实现的目标:
经过一些测试,我得出的结论是,将坐标转换为笛卡尔网格以计算直方图并返回绘图的开销是可以接受的。 NumPy
中的矩阵运算相当高效,我可以在不到 7 秒的时间内处理 115+ 百万个点。
然而,"back"部分可以由Matplotlib
直接用matplotlib.transforms
处理。
pcolormesh
、hist2d
和 imshow
都接受 transform
关键字,可用于将笛卡尔数据绘制到所需的坐标中,如下所示:
# set I, J, bins (in the Cartesian system) and cmap
# a, b, c, d, e, f are values of the transformation matrix
transform = matplotlib.transforms.Affine2D.from_values(a, b, c, f, d, e, f)
fig, ax = plt.subplots(figsize=figsize)
_, _, _, im = ax.hist2d(I, J, bins=bins, cmap=cmap, transform=transform + ax.transData)
fig.colorbar(im)
ax.autoscale()
它并不比用 NumPy
处理 "back" 转换快多少,但它可以使代码更轻,因为它只需要 1 个额外的行和 1 个额外的关键字。
imshow
可能有点麻烦,因为它在使用 ax.autoscale()
后不会更新显示范围,并且它将坐标作为图像或矩阵处理,因此必须相应地调整 transform
。由于这些原因,我更喜欢 hist2d
。
参考文献: