Pyplot Imshow Autozoom删除不规则的NaN填充

时间:2017-09-25 16:38:39

标签: numpy matplotlib imshow

我有以下代码

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的情节区域?

有一些警告。

  • 填充是不相等的:在这个例子中,填充在所有方面都是相同的,但这不是我的实际数据,因此它不能假设每一侧都有相同的填充。

  • 无法物理编辑数组:实际数据实际上是带有WCS坐标数据的天文FITS文件,因此使用带有plt.fig.add_subplot(projection = wcs)命令的WCSAxesSubplot系统和来自astropy的FITS头文件,但在我的示例代码中没有办法很好地包含它。 (那就是说,我有信心如果有人能告诉我如何在常规的pyplot / matplotlib / imshow中做到这一点,我可以通过某种方式转移它。)真正的问题是因此我无法编辑原始数据数组来删除NaNs因为我的头文件(即参考像素)将是不正确的,我的坐标将关闭。

  • NaNs可能无法与图像边缘对齐:未来的数据集可能会略微旋转,甚至在图像的位之间也有NaN的字段。因此,我不能切掉我的图像的角落或位,只是为了很好地适应其他位。缩放后,仍可能需要显示某些NaN。 (现在这不是一个问题,因为我目前的数据集都有漂亮,笔直,轴平行边缘)。

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

1 个答案:

答案 0 :(得分:0)

这应该有效:

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值构建行和列的精美索引。