添加阴影到imshow - Matplotlib

时间:2014-08-07 14:17:21

标签: python matplotlib

基本上,我要做的是在this问题的答案中解释的想法。

我使用imshow绘制100 x 100的图像,并且在某些点上,我想绘制阴影。

所以,这是我的图片示例:

enter image description here

这表示100个标量场样本的平均值。我也有这个样本的标准偏差:

enter image description here

所以,我想做的是绘制在我有标准偏差的位置上的平均属性与阴影相结合> 0.0。

我的数据是100 x 100,其尺寸从-4到4不等。 根据提出的想法here,我目前的做法是:

plt.figure()
fig = plt.imshow(scalar_field, origin='lower', extent=(-4, 4, -4, 4))
plt.colorbar(fig)

x_indices = numpy.nonzero(standard_deviation)[0]
y_indices = numpy.nonzero(standard_deviation)[1]

ax = plt.gca()
for p in range(len(x_indices)):
    i = x_indices[p]
    j = y_indices[p]
    ax.add_patch(patches.Rectangle((i-.5, j-.5), 1, 1, hatch='//', fill=False, snap=False))

plt.show()
plt.close()

但是,我没有将图案放在正确的位置。到目前为止我还没有使用补丁,我不知道我是否正确使用它们。

enter image description here

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

您需要将索引(0..99)转换为图像的比例(-4..4),并且每个块的大小不是1,1,而是0.08,0.08。此外,您需要在矩形中使用ec ='None'来移除块之间的边缘。我相信它会:

ax.add_patch(patches.Rectangle(((i-50.5)*0.08-.04, (j-50.5)*0.08), 0.08, 0.08, 
   hatch='//', fill=False, snap=False, linewidth=0))

但是,我怀疑你会用阴影填充整个区域:你确定stddev在某些地方恰好为零(它永远不会小于零)。

答案 1 :(得分:0)

您可以使用contourf来添加阴影,而不用在多个矩形中添加阴影,如contourf hatching example中所述。这是一个更好的解决方案,因为它更通用,只需要一行:

private function CreatedModified(){
   if(action==create){
       model.created_by = current_login_user_id;
       model.created_time = current_datetime
   }else if(action==edit){
       model.modified_by = current_login_user_id; 
       model.modified_time = current_datetime;
   }
}

其中plt.contourf(mask, 1, hatches=['', '//'], alpha=0) 是与图像大小相同的二进制图像。在这里,我们将mask设置为零以使掩码本身透明,并且仅在掩码等于1的位置添加了阴影。还要注意alphaorigin参数必须匹配,因此对于您的代码:

extent

类似的解决方案是使用pcolor代替plt.contourf(standard_deviation > thresh, 1, hatches=['', '//'], alpha=0, origin='lower', extent=(-4, 4, -4, 4)) ,如this answer所述。