在imshow中添加填充图案 - Matplotlib

4 投票
2 回答
3150 浏览
提问于 2025-04-18 16:24

基本上,我想做的事情是参考这个问题的答案中解释的想法。

我用imshow画了一个100 x 100的图像,并且在某些点上,我想加上斜线图案。

这是我的图像示例:

enter image description here

这个图表示的是100个样本的标量场的平均值。我还有这些样本的标准差:

enter image description here

所以,我想做的是把平均值和标准差大于0.0的位置结合起来,画上斜线图案。

我的数据是100 x 100,数值范围从-4到4。根据这里提出的想法,我目前的做法是:

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()

然而,我没有在正确的位置得到图案。我到现在为止还没有使用补丁(patches),也不知道我是否正确使用了它们。

enter image description here

任何帮助都会很感激。

2 个回答

2

与其在多个矩形中添加斜线,不如使用contourf来添加,具体方法可以参考contourf的斜线示例。这样做更好,因为它更通用,只需要一行代码:

plt.contourf(mask, 1, hatches=['', '//'], alpha=0)

这里的mask是一个和你的图像大小一样的二进制图像。我们把alpha设置为零,这样遮罩本身就变得透明了,只有在遮罩等于1的地方才会添加斜线。还要注意,originextent这两个参数需要匹配,所以在你的代码中:

plt.contourf(standard_deviation > thresh, 1, hatches=['', '//'], alpha=0,
             origin='lower', extent=(-4, 4, -4, 4))

还有一种类似的解决方案是使用pcolor,而不是contourf,具体可以参考这个回答

4

你需要把索引(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))

不过,我怀疑你会把整个区域都填满斜线:你确定标准差在某些地方是完全为零的吗(它不可能小于零)。

撰写回答