После некоторого тестирования я пришел к выводу, что накладные расходы на преобразование координат в декартову сетку для вычисления гистограммы и обратно для построения графика приемлемы. Матричные операции в NumPy
довольно эффективны, и я могу обработать 115+ миллионов точек менее чем за 7 секунд.
Однако «задняя» часть может обрабатываться 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
, но может сделать код легче, так как требует только1 дополнительная строка и 1 дополнительное ключевое слово.
imshow
может быть немного болезненно, поскольку не будет обновлять экстент отображения после использования ax.autoscale()
и обрабатывает координаты в виде изображений или матрицы, так что transform
имеетбыть скорректированы соответственно. По этим причинам я предпочитаю hist2d
.
Справочные материалы:
- https://matplotlib.org/3.1.1/api/transformations.html#module-matplotlib.transforms
- https://matplotlib.org/3.1.1/tutorials/advanced/transforms_tutorial.html