Pyplot Imshow Autozoom 剪掉不规则的 NaN 填充

Pyplot Imshow Autozoom to cut out Irregular NaN padding

我有以下代码

import matplotlib.pyplot as plt
import numpy as np

array = np.pad(np.random.rand(300,300),10,'constant', constant_values =  nan)

fig, ax = plt.subplots()
l = ax.imshow(array, origin = 'lower')

plt.show()

如您所见,它绘制了一个图像,边缘周围有一个 NaN 边框。有没有办法让 Imshow 自动裁剪或自动缩放到没有 NaN 的绘图区域?

有一些注意事项。

如果您能提供任何帮助,我们将不胜感激。我很乐意提供额外的信息。此外,一旦自动实现缩放,如果有人可以指出如何从图像中恢复当前缩放,那就太好了(因为它解决了一个不相关的问题)。

这应该有效:

mask = ~np.isnan(array)
x = np.flatnonzero(np.any(mask, axis = 0))
x = np.arange(x.min(), x.max() + 1)[:, None]
y = np.flatnonzero(np.any(mask, axis = 1))
y = np.arange(y.min(), y.max() + 1)

plt.imshow(array[x,y], origin = 'lower')

基本上只是用任何非nan值构建行和列的奇特索引。

您可以确定 non-NaN 个元素的索引,如下所示

bound = np.argwhere(~np.isnan(array))

xlimylim 只是这些指数的 minima/maxima

plt.xlim(min(bound[:, 1]), max(bound[:, 1]))
plt.ylim(min(bound[:, 0]), max(bound[:, 0]))

要缩小,只需执行以下操作

shape = np.shape(array)
plt.xlim(0, shape[1]-1)
plt.ylim(0, shape[0]-1)