在matplotlib中叠加imshow图像的绘制

33

我想在同一个imshow图上比较两组不同的数据,以便更容易地看出它们之间的差异。 我的第一反应是使颜色映射中的颜色变为透明(特别是较低的值),但我还没有成功做到这一点:

from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt
import numpy as np

# create dummy data
zvals =  np.random.rand(100,100)*10-5
zvals2 = np.random.rand(100,100)*10-5

# generate the transparent colors
color1 = colorConverter.to_rgba('white',alpha=0.0)
color2 = colorConverter.to_rgba('black',alpha=0.8)

# make the colormaps
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256)
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256)

img2 = plt.imshow(zvals,interpolation='nearest',cmap=cmap1,origin='lower')
img3 = plt.imshow(zvals2,interpolation='nearest',cmap=cmap2,origin='lower')

plt.show()

第二个图的白色和黑色没有透明度,但是没有错误。我也尝试使用colorConverter方法在正常的plt.plot情况下设置颜色,尽管显示了正确的颜色,但颜色仍未变成透明。

如何叠加/比较imshow图的任何其他建议都将不胜感激。


2
为什么不绘制两个图像数据集的差异?或者进行相关转换的差异,例如将它们转换为分贝比例。 - ely
到目前为止,我用这种方法还没有取得非常好的结果,但我会继续尝试,同时希望有人知道如何使个别颜色透明度正常工作。 - Anake
3个回答

45
你可以在imshow命令中设置alpha参数。
在你的例子中,img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

编辑:

感谢澄清。以下是你可以做的描述:
  • 首先,选择matplotlib colormap对象(在你的情况下,为了白色和黑色,你可以使用'binary' colormap)。如果你想要的colormap不存在,则可以创建自己的colormap。
  • 然后初始化这个colormap对象:这会导致它在内部创建一个称为"_lut"的数组,其中包含rgba值。
  • 接着,你可以根据你想要实现的效果来填充alpha值(在你的例子中,创建一个从0到0.8的数组)
  • 最后,你可以使用这个colormap
下面是一个使用你的代码的例子:
from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

# create dummy data
zvals = np.ones((100,100))# np.random.rand(100,100)*10-5
zvals2 = np.random.rand(100,100)*10-5

# generate the colors for your colormap
color1 = colorConverter.to_rgba('white')
color2 = colorConverter.to_rgba('black')

# make the colormaps
cmap1 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap',['green','blue'],256)
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_cmap2',[color1,color2],256)

cmap2._init() # create the _lut array, with rgba values

# create your alpha array and fill the colormap with them.
# here it is progressive, but you can create whathever you want
alphas = np.linspace(0, 0.8, cmap2.N+3)
cmap2._lut[:,-1] = alphas

img2 = plt.imshow(zvals, interpolation='nearest', cmap=cmap1, origin='lower')
img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower')

plt.show()

image


2
抱歉我表达不够清晰,我希望对于接近0的值具有非常低的alpha值,这样背景就不会覆盖下面图形的颜色。已经进行了编辑。 - Anake
似乎LinearSegmentedColormap等函数无法处理alpha值,你的方法是一个很好的解决办法。 - tom10
谢谢,这是一个很有灵感的解决方法。但仍不完全符合我的要求,因为我不想有任何白色,只想有逐渐增加的黑色,但似乎这是不可能的。 - Anake
1
@Anake 如果你只想要逐渐增加黑色的数量(通过逐渐增加alpha值),只需使用相同的代码,但将color1行更改为color1 = colorConverter.to_rgba('black')(类似于color2)。 - gcalmettes

4
如果您制作定制的cmap,它可以轻松解决超出叠加问题。
cmap1 = matplotlib.colors.ListedColormap(['none', 'green'])
cmap2 = matplotlib.colors.ListedColormap(['none', 'red'])


img2 = plt.imshow(~~~ cmap=cmap1 ~~~)
img3 = plt.imshow(~~~ cmap=cmap2 ~~~)


0

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