Skip to main content
 首页 » 编程设计

python之Matplotlib 中的空、零和非零像素表示

2025年05月04日18me-sa

我正在尝试绘制光线追踪路径,其中像素值在 matplotlib 中获得非“-1”值。换句话说,我有以下代表 4 条光线路径的二维数组。光线穿过的每个像素都有随机值。除了这些相交的像素,其余的都是“-1”。我想以白色或不可见(不存在)显示值“-1”。怎么可能?

import numpy as np 
import scipy as sp 
import pylab as pl 
 
M = np.array([[ 0. , -1., -1., -1., -1., -1.], 
          [ 0.25, -1.,-1.,-1.,-1.,-1.], 
          [ 0.25, -1., -1., -1.,-1.,-1.], 
          [ 0.22, -1., -1., -1., -1.,-1.], 
          [ 0.16, -1., -1., -1., -1.,-1.], 
          [ 0.16, -1., -1., -1., -1.,-1.], 
          [ 0.13, -1., -1., -1., -1.,-1.], 
          [ 0.10, -1., -1., -1., -1.,-1.], 
          [-1., 0.06, 0.14, 0.087, 0.079,0.], 
          [ 0., 0.16, 0.10, 0.15, 0.16, 0.], 
          [-1., -1., 0., 0.004,-1., -1.]]) 
 
pl.subplot(111) 
pl.imshow(M, origin='lower', interpolation='nearest') 
pl.show() 

请您参考如下方法:

另一种方法是使用颜色映射的 set_under、set_over 和 set_bad 属性 (doc)

from copy import copy 
 
# normalize data between vmin and vmax 
my_norm = matplotlib.colors.Normalize(vmin=.25, vmax=.75, clip=False) 
# clip=False is important, if clip=True, then the normalize function 
# clips out of range values to 0 or 1 which defeats what we want to do here. 
 
my_cmap = copy(cm.get_cmap('gray')) # make a copy so we don't mess up system copy 
my_cmap.set_under('r', alpha=.5) # make locations over vmax translucent red 
my_cmap.set_over('w', alpha=0)   # make location under vmin transparent white 
my_cmap.set_bad('g')             # make location with invalid data green 
 
test_data = np.random.rand(10, 10) # some random data between [0, 1] 
test_data[5, 5] = np.nan           # add one NaN 
# plot! 
imshow(test_data, norm=my_norm, cmap=my_cmap, interpolation='nearest') 

我认为这是一种比手动制作掩码数组更好的方法,因为您让 matplotlib 为您完成工作,并且它允许您独立地显式设置三种不同条件的颜色。