如何使用Python在连续的非分支线上围绕热图上的某些像素?

zab*_*bop 6 python matplotlib astronomy heatmap python-3.x

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

在此输入图像描述

我需要指出一个障碍,以显示我关心的像素.这与我需要的相似:

在此输入图像描述

我知道如何添加广场到图像,网格线的图像,但这种知识不能解决issuue,也不增加单广场的PIC,这也是我的能力范围之内.我需要一条围绕网格区域的线(这条线总是需要在像素之间,而不是跨越它们,所以这可能会使它更简单一点).

我怎样才能做到这一点?


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
Run Code Online (Sandbox Code Playgroud)

现在selected1是一个布尔数组的数组,我们想只圈出那些Z值大于1.5的像素.我们还想圈selected2,其中包含True值大于0.2且小于1.8的像素值:

upperlim_selected2 = Z<1.8
selected2 = upperlim_selected2>0.2
Run Code Online (Sandbox Code Playgroud)

Iury Sousa的出色工作对于这个案子不起作用.plt.plot在我看来会 什么是实现selected1selected2使用plt.plot或使用其他方法的有效方法?

Imp*_*est 3

类似于Can matplotlibcontoursmatchpixeledges?中的答案 您可以创建更高分辨率的网格并绘制绘图contour

import numpy as np
import matplotlib.pyplot as plt

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

resolution = 25

f = lambda x,y: Z[int(y),int(x) ]
g = np.vectorize(f)

x = np.linspace(0,Z.shape[1], Z.shape[1]*resolution)
y = np.linspace(0,Z.shape[0], Z.shape[0]*resolution)
X2, Y2= np.meshgrid(x[:-1],y[:-1])
Z2 = g(X2,Y2)


plt.pcolormesh(X,Y, Z)
plt.contour(X2,Y2,Z2, [1.5], colors='r', linewidths=[1])

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述