【问题标题】:Selective patterns with Matplotlib imshow使用 Matplotlib imshow 的选择性模式
【发布时间】:2012-12-26 20:12:05
【问题描述】:

有没有办法将自定义模式放置到 imshow 图表上的选定区域中?准确地说,我需要做到这一点,除了带有数字数据的彩色方块外,我在其他方块中也有不同的图案,表示实验的不同故障模式(并且还生成一个解释这些含义的密钥不同的图案)。一个有用的模式示例是各种类型的交叉影线。我需要能够在不破坏图表上主要颜色-数字数据关系的情况下做到这一点。

以下是我尝试使用答案中建议的代码。如果我评论错误部分,则在没有来自掩码的数据的情况下,imshow 会在空白处显示良好。我什至没有尝试对不同的故障类型进行不同类型的交叉影线处理,也没有尝试处理模拟或实验工作但另一个还没有工作的情况。

EDIT3:我从多处理程序包中收到关于它如何“无法腌制”对象的错误消息。由于该程序,这是它的一部分通过多处理包。有什么方法可以解决这个问题,或者不使用 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 设置为imshow 返回的对象,您需要将补丁对象添加到axes 对象。
  • 另外,importing matplotlib.pyplot as plot 让你的代码读起来有点奇怪。
  • 对不起,我修复了斧头问题,但忘记在此处更新(我从您写的内容中复制得太快了)。 matplotlib 不是作为绘图导入的,它只是在代码中更高的坐标轴被分配给绘图(它使代码在上下文中更容易阅读)。当我调用 patch 时,你会注意到它是作为 mpl 导入的。
  • 你搞定了吗?我修改了关于plot 的声明,将其用作变量名,这让我很困惑。
  • 你用的是什么版本的matplotlib?

标签: matplotlib graphing


【解决方案1】:

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

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

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(doc) 多种哈希选项。这只是在图像之上添加额外的艺术家,它们不会以任何方式影响数据颜色映射。大量的/ 增加了散列标记的密度,这可能是实际看到带有小框的散列所必需的。

例如:

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') 并可能使用标记大小)。

【讨论】:

  • 此方法一般有效,但被我正在使用的特定软件包阻止。因此,我接受它作为答案,因为它通常对其他用户有用。
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2016-03-17
  • 2021-02-23
  • 2019-01-22
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多