python - 如何使用 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
会,在我看来。使用或其他方法实现selected1
and的循环的有效方法是什么?selected2
plt.plot
解决方案
我尝试了一些应该满足您需求的东西。
首先,我定义了一个任意数据:
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')
推荐阅读
- sql - 如何返回日期字段添加两天而不影响原始日期?
- android - E/com.facebook.appevents.RestrictiveDataManager:updateRulesFromSetting 失败
- c# - 如何获取登录用户名
- spring-boot - 无需重定向到 Keycloak 的客户端身份验证
- c# - 我会找出接下来几天的日期
- prestashop - “取消分组”产品功能
- python - 使用子进程库:错误:无法识别的参数
- c++ - “不能从 'std::ofstream {aka std::basic_ofstream
}' to bool" 错误作为回报 - laravel - 无法更新第一次创建以外的其他表行
- solr - 索引多个文档