首页 > 解决方案 > 如何使用 Python 用连续的非分支线包围热图上的一些像素?

问题描述

plt.imshow()用来在网格上绘制值(在我的例子中是 CCD 数据)。一个示例图:

在此处输入图像描述

我需要在上面指出一个障碍,以显示我关心的像素。这类似于我需要的:

在此处输入图像描述

我知道如何在图像中添加正方形,在图像中添加网格线,但是这些知识并不能解决问题,也不能在图片中添加单个正方形,这也在我的能力范围内。我需要一条线来环绕网格上的一个区域(这条线总是需要在像素之间移动,而不是穿过它们,所以这可能会使它更简单一点)。

我怎样才能做到这一点?


Iury Sousa为上述问题提供了一个很好的解决方法。但是,它并没有严格地用一条线环绕该区域(而是在图片上绘制一个遮罩,然后再次用图片覆盖大部分区域),当我尝试环绕重叠的像素组时它失败了。ImportanceOfBeingErnest在评论中建议我应该简单地使用plt.plot示例。使用Iury Sousa的示例作为起点,我们可以:

X,Y = np.meshgrid(range(30),range(30))
Z = np.sin(X)+np.sin(Y)
selected1 = Z>1.5

现在selected1是一个布尔数组数组,我们只想圈出对应 Z 值大于 1.5 的像素。我们还想圈出selected2,其中包含True值高于 0.2 和低于 1.8 的像素值:

upperlim_selected2 = Z<1.8
selected2 = upperlim_selected2>0.2

Iury Sousa的出色解决方法不适用于这种情况。plt.plot会,在我看来。使用或其他方法实现selected1and的循环的有效方法是什么?selected2plt.plot

标签: pythonpython-3.xmatplotlibheatmapastropy

解决方案


我尝试了一些应该满足您需求的东西。

首先,我定义了一个任意数据:

X,Y = np.meshgrid(range(30),range(30))

Z = np.sin(X)+np.sin(Y)

在这里,您可以定义适合您要突出显示的模式的条件:

selected = Z>1.5

要绘制你将使用scatter而不是imshow. 您将绘制所有数据,然后再绘制两次选定的数据,一次使用具有突出显示颜色的较大正方形,另一次通常使用相同的颜色参考和限制。

info = dict(marker='s',vmin=-2,vmax=2)
fig,ax = plt.subplots()
plt.scatter(X.ravel(),Y.ravel(),100,c=Z.ravel(),**info)
plt.scatter(X[selected].ravel(),Y[selected].ravel(),150,c='r',marker='s')
plt.scatter(X[selected].ravel(),Y[selected].ravel(),100,c=Z[selected].ravel(),**info)
ax.axis('equal')

在此处输入图像描述


推荐阅读