在pylab中使用可变alpha混合

7
如何在pylab中控制2D图像的透明度?我想提供两组值(X,Y,Z,T),其中X,Y是位置数组,Z是颜色值,T是透明度,并将其传递给imshow函数,但似乎该函数只接受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的图形(那很简单),而是想找一种通用的方法来指定图像上的alpha混合。
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值。如果您查看它返回的值,它们都具有1.0作为A值(透明度)。因此,制作可变透明度的一种方法是:

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)

您可能会找到更加优雅的方法来完成这个任务,但是希望您能够理解这个思路。


这太棒了,正是我在寻找的!深入研究后,我发现imshow可以使用MxNx4即用户预定义的颜色映射的Z数组。谢谢! - Hooked
太好了!你可以通过 tmp[:,:,3]=array_of_shape_of_x 来改变这两个嵌套循环。 - Geoffroy

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