簡體   English   中英

在 matplotlib 中疊加 imshow 圖

[英]Overlay imshow plots in matplotlib

我想在同一個 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 圖的任何其他建議將不勝感激

您可以在imshow命令中設置alpha參數。

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

編輯:

感謝您的澄清。 以下是您可以執行的操作的說明:

  • 首先,選擇一個matplotlib 顏色圖對象(在您的情況下,對於白色和黑色,您可以采用“二進制”顏色圖)。 或者,如果您想要的顏色圖尚不存在,則像您一樣創建自己的顏色圖。
  • 然后初始化這個顏色圖對象:這將導致它在內部創建一個名為“_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()

圖像

此處鏈接的答案涉及屏蔽您的輸入數組,似乎對我更有效: Setting Transparency Based on Pixel Values in Matplotlib

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM