用Matplotlib imshow实现选择性图案

4
有没有办法在imshow图形中放置自定义模式到选定区域?更准确地说,我需要使其他正方形中的不同模式表示实验失败的不同模式(并生成解释这些不同模式含义的键),除了携带数字数据的彩色正方形之外。有用的模式示例将是各种类型的十字线。我需要能够在不破坏图表上的主要颜色数字数据关系的情况下完成此操作。
以下是我尝试使用答案中建议的代码。如果我注释错误部分,则imshow会显示出空白处,其中没有来自掩模的数据。我甚至没有尝试为不同的故障类型做不同种类的交叉处理或处理模拟或实验都有效但另一个无效的情况。
编辑3:我从多进程包中收到有关“无法pickle”对象的错误信息。由于程序的原因,它经过多进程包。有没有办法修复这个问题或者不使用add_patches(下面建议的绘图方法不起作用,因为绘图发生在完全不同的坐标系上并绘制连接线)?
import numpy as np
import matplotlib.patches as patches
...
grid = np.ma.array(grid, mask=np.isnan(grid))
plot.imshow(grid, interpolation='nearest', aspect='equal', vmax = private.vmax, vmin = private.vmin)
if show_fail and faildat != []:
    faildat = faildat[np.lexsort((faildat[:,yind],faildat[:,xind]))]
    fails = []
    for i in range(len(faildat)):
        fails.append((faildat[i,1],faildat[i,0]))
    for F in fails:
        p = patches.Rectangle(F,1,1,hatch='/',fill=False)
        plot.add_patch(p)
plot.minorticks_off()
plot.set_xticks(range(len(placex)))        
plot.set_yticks(range(len(placey)))
plot.set_xticklabels(placex)        
plot.set_yticklabels(placey, rotation = 0)
plot.colorbar()
plot.show()

抱歉,我已解决了ax问题,但忘记在此更新(我从您的写作中复制得太快了)。matplotlib并不是以plot的形式导入的,只是在代码更高的位置将axes分配给了plot(在上下文中,这样做使代码更易于阅读)。当我要调用patch时,您会注意到它被导入为mpl。 - Elliot
你解决了吗?我修正了关于plot的说法,把它用作变量名会让我感到困惑。 - tacaswell
你能复制粘贴你所遇到的确切错误吗? - tacaswell
文件“C:\ Python27 \ lib \ multiprocessing \ managers.py”,第758行,在_callmethod中: conn.send((self.id,methodname,args,kwds)) PicklingError:无法pickle <type 'function'>:属性查找__builtin_.function失败。 - Elliot
picklemultiprocessing是从哪里进入这个问题的? - tacaswell
显示剩余5条评论
1个回答

12

有几种方法可以做到这一点,哪种更好取决于您是否需要标记大区域或分散的单个像素。

如果您需要标记大区域,可以通过在图像上添加矩形来实现:

有多种方法可供选择,具体取决于您需要标记的是大区域还是分散的单个像素。如果需要标记大区域,可以通过在图像上添加矩形来实现:

import matplotlib as mpl
import matplotlib.pyplot as plt
from numpy.random import rand

ax = plt.gca()
ax.imshow(rand(50,50))
ax.add_patch(mpl.patches.Rectangle((2,2),20,20,hatch='//////////',fill=False,snap=False))
plt.draw()

Rectangle (文档)提供了多种哈希选项。这只是在图像上添加额外的艺术元素,它们不会以任何方式影响数据-颜色映射。大量使用/可以增加哈希标记的密度,在小方块中实际看到哈希标记可能是必要的。

例如:

from numpy.random import rand
import matplotlib as mpl
import matplotlib.pyplot as plt
     
ax = plt.gca()
ax.imshow(rand(50,50),interpolation='nearest')
for i,j in np.floor(50*rand(10,2)).astype('int'):
    ax.add_patch(mpl.patches.Rectangle((i-.5, j-.5), 1, 1, hatch='///////', fill=False, snap=False))

plt.draw()

一张像素有点斑驳的图片 如果你只需要标记很少的几个像素,可能只需使用plot([x],[y],marker='x')进行绘制,然后可以根据需要调整标记大小。


1
这种方法通常可行,但被我使用的特定软件包所阻止。因此,我将其作为答案接受,因为它对其他用户通常有用。 - Elliot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接