6

我有一个数组,其中包括体面的观察、不相关的观察(我想屏蔽掉)和没有观察到的区域(我也想屏蔽掉)。我想将此数组显示为具有两个单独蒙版的图像(使用 pylab.imshow),其中每个蒙版以不同的颜色显示。

我找到了某种颜色的单个掩码(此处)的代码,但没有找到两个不同掩码的代码:

masked_array = np.ma.array (a, mask=np.isnan(a))
cmap = matplotlib.cm.jet
cmap.set_bad('w',1.)
ax.imshow(masked_array, interpolation='nearest', cmap=cmap)

如果可能的话,我想避免使用严重失真的颜色图,但接受这是一种选择。

4

4 回答 4

4

您可以根据某些条件简单地将数组中的值替换为某个固定值。例如,如果要屏蔽大于 1 且小于 -1 的元素:

val1, val2 = 0.5, 1
a[a<-1]= val1
a[a>1] = val2
ax.imshow(a, interpolation='nearest')

val1并且val2可以修改以获得您想要的颜色。

您也可以显式设置颜色,但这需要更多工作:

import matplotlib.pyplot as plt
from matplotlib import colors, cm

a = np.random.randn(10,10)

norm = colors.normalize()
cmap = cm.hsv
a_colors = cmap(norm(a))

col1 = colors.colorConverter.to_rgba('w')
col2 = colors.colorConverter.to_rgba('k')

a_colors[a<-0.1,:] = col1
a_colors[a>0.1,:] = col2
plt.imshow(a_colors, interpolation='nearest')
plt.show()
于 2012-11-14T17:54:44.820 回答
3

对我来说,最简单的方法是直接用 imshow 绘制蒙版,传递不同的颜色图。颜色图的最大值和最小值用于 True 和 False 值:

mask1=np.isnan(a)
mask2=np.logical_not(mask1)
plt.imshow(mask1,cmap='gray')
plt.imshow(mask2,cmap='rainbow')

在此处输入图像描述

然而,这个(和建议的其他方法)也绘制了 False 值,覆盖了以前的图。如果您想避免绘制 False 值,可以通过将数组转换为浮点数后将它们替换为 np.nan 来完成(np.nan 的类型为浮点数,不能包含在布尔掩码中)。未绘制 nan 值:

mmm=mask.astype(np.float)
mmm[np.where(mmm==0)]=np.nan
#the substitution can be done also in one line with:
#mmm=np.where(mask,mask.astype(np.float),np.nan)
plt.imshow(mmm,cmap='rainbow',vmin=0,vmax=1)) #will use only the top color: red. vmin and vmax are needed if there are only one value (1.0=True) in the array.
plt.colorbar()
#repeat for other masks...

在此处输入图像描述 而且我希望我不会偏离主题,但是可以使用相同的技术来绘制具有不同颜色图的数据的不同部分,方法是将绘图命令替换为:

plt.imshow(mmm*data,cmap='rainbow')

在此处输入图像描述

于 2015-12-04T02:23:35.197 回答
2

为了将一些像素着色为红色,另一些像素为绿色,如下图所示,我使用了下面的代码。(有关详细信息,请参阅代码注释。)

两个掩码与 matplotlib 矩阵图一起使用的示例

import numpy as np              #Used for holding and manipulating data
import numpy.random             #Used to generate random data
import matplotlib as mpl        #Used for controlling color
import matplotlib.colors        #Used for controlling color as well
import matplotlib.pyplot as plt #Use for plotting

#Generate random data
a = np.random.random(size=(10,10))

#This 30% of the data will be red
am1 = a<0.3                                 #Find data to colour special
am1 = np.ma.masked_where(am1 == False, am1) #Mask the data we are not colouring

#This 10% of the data will be green
am2 = np.logical_and(a>=0.3,a<0.4)          #Find data to colour special
am2 = np.ma.masked_where(am2 == False, am2) #Mask the data we are not colouring

#Colourmaps for each special colour to place. The left-hand colour (black) is
#not used because all black pixels are masked. The right-hand colour (red or
#green) is used because it represents the highest z-value of the mask matrices
cm1 = mpl.colors.ListedColormap(['black','red'])
cm2 = mpl.colors.ListedColormap(['black','green'])

fig = plt.figure()                          #Make a new figure
ax = fig.add_subplot(111)                   #Add subplot to that figure, get ax

#Plot the original data. We'll overlay the specially-coloured data
ax.imshow(a,   aspect='auto', cmap='Greys', vmin=0, vmax=1)

#Plot the first mask. Values we wanted to colour (`a<0.3`) are masked, so they
#do not show up. The values that do show up are coloured using the `cm1` colour
#map. Since the range is constrained to `vmin=0, vmax=1` and a value of
#`cm2==True` corresponds to a 1, the top value of `cm1` is applied to all such
#pixels, thereby colouring them red.
ax.imshow(am1, aspect='auto', cmap=cm1, vmin=0, vmax=1);
ax.imshow(am2, aspect='auto', cmap=cm2, vmin=0, vmax=1);
plt.show()
于 2018-06-25T07:30:10.383 回答
0

我不知道数组中的值是什么,但是您可以转换遮罩区域,使 X 值变为 RGB(A) 值(元组(R,G,B,A)),在这种情况下,根据文档, cmap 将被忽略.

• cmap: [ 无 | 颜色图]

一个 matplotlib.colors.Colormap 实例,例如。厘米喷射。如果没有,默认为 rc image.cmap 值。当 X 具有 RGB(A) 信息时忽略 cmap

于 2012-11-14T17:47:49.147 回答