0

我需要计算(并绘制) ahistogram2d但我的分箱网格是旋转的并且也是非正交的。
这样做的一种方法是对我的数据应用转换,以便将其放入笛卡尔系统中,计算我的histogram2d,然后应用逆变换。
这可以在没有这种开销转换的情况下直接完成吗?

我想我的问题是:在这种情况下如何定义binsfor my histogram2d?(AFAIK,histogram2d只接受 x 和 y 对齐bins

我的数据是 2 个巨大的点列表(每个 10k~100k),它们的坐标在笛卡尔坐标系中给出(实际上是投影的 CRS,因为这些是真实世界的位置),但它们组织在一个不规则的网格中与 X 轴和 Y 轴(旋转)对齐,并且可能正交也可能不正交。分箱网格将从它派生,因此它将是(旋转的)规则四边形网格。

我已经看到matplotlib有一个QuadMesh对象(请参阅此处),所以我充满希望,但我不确定如何处理这个问题NumPy

基本上这就是我想要实现的目标:

在此处输入图像描述

4

1 回答 1

1

经过一些测试,我得出的结论是,将坐标转换为笛卡尔网格以计算直方图并返回以进行绘图的开销是可以接受的。矩阵运算NumPy相当有效,我可以在不到 7 秒的时间内处理 115+ 百万个点。

但是,“返回”部分可以Matplotlib直接用处理matplotlib.transforms
pcolormeshhist2d并且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但它可以使代码更轻,因为它只需要 1 个额外的行和 1 个额外的关键字。
imshow可能有点痛苦,因为它在使用后不会更新显示范围,ax.autoscale()并且它将坐标处理为图像或矩阵,因此transform必须相应地调整。由于这些原因,我更喜欢hist2d.

参考:

  1. https://matplotlib.org/3.1.1/api/transformations.html#module-matplotlib.transforms
  2. https://matplotlib.org/3.1.1/tutorials/advanced/transforms_tutorial.html
于 2019-10-23T18:58:19.847 回答