pylab中的可变alpha混合
在pylab中,如何控制2D图像的透明度呢?我想给一个函数,比如imshow
,提供两组值(X,Y,Z,T)
,其中X,Y
是位置的数组,Z
是颜色值,而T
是透明度。不过,似乎这个函数只接受一个单一的透明度值(alpha)。举个具体的例子,下面的代码试图显示两个高斯分布。值越接近零,我希望图表越透明。
from pylab import *
side = linspace(-1,1,100)
X,Y = meshgrid(side,side)
extent = (-1,1,-1,1)
Z1 = exp(-((X+.5)**2+Y**2))
Z2 = exp(-((X-.5)**2+(Y+.2)**2))
imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent)
imshow(Z2, cmap=cm.hsv, alpha=.6, extent=extent)
show()
注意:我并不是想要Z1+Z2的图(那太简单了),而是想要一种通用的方法来在图像中指定透明度混合。
1 个回答
8
你可以做的一件事是修改你放入 imshow 的内容。第一个变量可以是灰度值,就像你之前用的那样,也可以是 RGB 或 RGBA 值。如果你使用 RGB/RGBA 值,那么 cmap 就会被忽略。所以举个例子,
imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent)
会生成和下面这个一样的图像:
imshow(cm.hsv(Z1), alpha=.6, extent=extent)
因为 cm.hsv()
只是返回 RGBA 值。如果你看看它返回的值,你会发现它们的 A 值(透明度)都是 1.0。所以,制作可变透明度的一种方法可以是这样的:
def mycmap(x):
tmp = cm.hsv(x)
for i in xrange(tmp.shape[0]):
for j in xrange(tmp.shape[0]):
tmp[i,j][3] = somefunction of x[i,j] that generates the transparency
return tmp
imshow(mycmap(Z1), extent=extent)
imshow(mycmap(Z2), extent=extent)
你可能会找到更优雅的做法,但希望你能明白这个思路。