Python 在matplotlib中覆盖imshow绘图

Python 在matplotlib中覆盖imshow绘图,python,numpy,matplotlib,Python,Numpy,Matplotlib,我想在同一个imshow图上比较两组不同的数据,以便于看到差异。 我的第一反应是使colormap中的颜色透明(尤其是较低的值),但我一直无法做到这一点: 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.rando

我想在同一个imshow图上比较两组不同的数据,以便于看到差异。 我的第一反应是使colormap中的颜色透明(尤其是较低的值),但我一直无法做到这一点:

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绘图的任何其他建议,我们将不胜感激

您可以在
imshow
命令中设置
alpha
参数

在您的示例中,
img3=plt.imshow(zvals2,interpolation='nearest',cmap=cmap2,origin='lower',alpha=0.6)

编辑: 谢谢你的澄清。 以下是您可以执行的操作说明:

  • 首先,选择一个对象(在您的例子中,对于白色和黑色,您可以使用“二进制”颜色贴图)。或者,如果您想要的颜色映射不存在,也可以像以前一样创建自己的颜色映射
  • 然后初始化这个colormap对象:这将导致它在内部创建一个名为“_lut”的数组,该数组保存rgba值
  • 然后,您可以根据想要实现的内容填充alpha值(在您的示例中,创建一个从0到0.8的数组)
  • 然后可以使用此颜色贴图
下面是使用您的代码的示例:

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()

此处链接的答案,包括屏蔽您的输入数组,似乎对我更有效:

很抱歉,我不清楚,我特别希望接近0的值有一个非常低的alpha值,这样背景就不会覆盖下面绘图的颜色。已进行相应编辑+1用于编辑添加。似乎LinearSegmentedColormap等不适用于alpha值,而您的是一个很好的解决方案。谢谢,这是一个有启发的解决方案。仍然不完全是我想要的,因为我不想有任何白色,只是增加了黑色的数量,但这似乎不是possible@Anake如果您只想增加黑色的数量(通过逐渐增加字母),只需使用相同的代码,但将color1行更改为
color1=colorConverter.to_rgba('black')
(与color2类似)。为什么不绘制两个图像数据集的减法?或者相关变换的减法,比如将它们转换为分贝。到目前为止,我还没有用这种方法得到很好的结果,但我仍在继续尝试,同时希望有人知道如何使单个颜色的透明度发挥作用