2012-04-12 30 views
18

Tôi muốn so sánh hai bộ dữ liệu khác nhau trên cùng một âm mưu imshow để dễ dàng thấy sự khác biệt. bản năng đầu tiên của tôi là làm cho màu sắc trong bản đồ màu trong suốt (giá trị thấp nhất là) nhưng tôi đã không thể có được điều này để làm việc:Overlay imshow lô trong matplotlib

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

Không có lỗi nhưng màu trắng và màu đen của ô thứ hai không hiển thị bất kỳ sự minh bạch nào. Tôi cũng đã thử phương pháp colorConverter để thiết lập màu sắc trong một tình huống plt.plot bình thường và màu sắc cũng không trở nên trong suốt mặc dù màu sắc chính xác được hiển thị.

Bất cứ lời khuyên thêm về cách overlay/so sánh imshow lô sẽ được nhiều đánh giá cao

+1

Tại sao bạn không vẽ các phép trừ của hai tập hợp dữ liệu hình ảnh? Hoặc phép trừ của một phép biến đổi có liên quan, như chuyển đổi chúng thành thang đo decibel. – ely

+0

Cho đến nay tôi chưa nhận được kết quả rất tốt với phương pháp này, nhưng tôi vẫn tiếp tục thử trong khi hy vọng ai đó biết cách làm cho từng màu trong suốt hoạt động – Anake

Trả lời

27

Bạn có thể thiết lập các tham số alpha trong lệnh imshow của bạn.

Trong ví dụ của bạn, img3 = plt.imshow(zvals2, interpolation='nearest', cmap=cmap2, origin='lower', alpha=0.6)

EDIT:

Cảm ơn bạn đã làm rõ. Dưới đây là một mô tả về những gì bạn có thể làm:

  • Đầu tiên, chọn một đối tượng matplotlib colormap (trong trường hợp của bạn, ví màu trắng và đen, bạn có thể lấy bản đồ màu 'nhị phân'). Hoặc tạo bản đồ màu của riêng bạn như bạn đã làm, nếu bản đồ màu bạn muốn không tồn tại.
  • Sau đó khởi tạo đối tượng colormap này: điều này sẽ làm cho nội bộ tạo ra một mảng được gọi là "_lut" chứa các giá trị rgba.
  • Sau đó, bạn có thể điền vào các giá trị alpha theo những gì bạn muốn đạt được (trong ví dụ của bạn, tạo ra một mảng 0-0,8)
  • Sau đó bạn có thể sử dụng bản đồ màu này

Dưới đây là một ví dụ sử dụng mã của bạn:

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

Xin lỗi tôi không rõ ràng, tôi đặc biệt muốn có giá trị alpha thấp cho các giá trị gần bằng 0 sao cho nền không che phủ màu của ô bên dưới. Đã chỉnh sửa cho phù hợp – Anake

+0

Tôi đã chỉnh sửa câu trả lời của mình trong điều kiện làm sáng tỏ điều này. – gcalmettes

+0

+1 để thêm chỉnh sửa. Có vẻ như LinearSegmentedColormap, v.v. không hoạt động cho các giá trị alpha, và của bạn là một công việc tốt. – tom10

Các vấn đề liên quan