我需要计算(并绘制)一个histogram2d,但是我的二进制网格是旋转的,也是非正交的。
这样做的一种方法是对我的数据应用一个转换,所以我把它转化成一个笛卡儿系统,计算我的histogram2d,然后应用逆变换。
在没有这种开销转换的情况下,这能直接完成吗?
我想我的问题是:在这种情况下,如何为我的bins定义histogram2d?(AFAIK,histogram2d只接受x和y对齐的bins)
我的数据是两个巨大的点列表(每个10k~100 k),它们的坐标是在笛卡尔坐标系中给出的(实际上是一个投影的CRS,因为这些是真实的位置),但是它们被组织在一个规则的网格中,不对齐X和Y轴(旋转),它可能是正交的,也可能不是正交的。二进制网格将从它导出,因此它将是一个(旋转的)规则四边形网格。
我已经看到matplotlib有一个QuadMesh对象(请看这里),所以我很有希望,但我不知道如何在NumPy中处理这个问题。
基本上这就是我想要达到的目标:

发布于 2019-10-23 18:58:19
经过一些测试后,我得出的结论是,将坐标转换为笛卡儿网格以计算直方图并返回绘图的开销是可以接受的。矩阵操作在NumPy中是相当有效的,我可以在不到7秒内处理115+ 100万个点。
但是,"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。
参考文献:
https://stackoverflow.com/questions/58288518
复制相似问题