2012-05-10 33 views
6

thể trùng lặp:
Add separate colors for two (or more) specific values in color plot and color barThiết màu tùy ý trong âm mưu PseudoColor với matplotlib

Tôi đã có một mảng các giá trị và tôi muốn vẽ những sử dụng pcolor trong matplotlib. Tôi đang sử dụng bản đồ màu 'YlOrRd' và nó hoạt động tốt - nhưng tôi muốn sử dụng bản đồ màu cho tất cả các giá trị khác 0. Đó là, tất cả các giá trị không phải 0, nên sử dụng bản đồ màu - Tôi muốn 0 là màu đen.

hiện tại tôi đang sử dụng, cho mảng giá trị "x" của tôi.

pcolor(x,cmap=cm.YlOrRd) 

có cách nào để tự ý sửa tất cả các giá trị trong mảng x từ 0 đến đen không?

Xin cảm ơn, Dave.

Trả lời

5

Dưới đây là hai cách để thực hiện. Một bằng cách tạo của riêng bạn colormap và một bằng cách sử dụng masked array. Nói chúng ta có:

import matplotlib 
from pylab import * 

data = np.arange(-50, 50).reshape(10, 10) 
data = np.abs(data) 
pcolor(data, cmap=cm.YlOrRd) 
show() 

này tạo ra: enter image description here Bây giờ chúng ta làm điều tương tự, nhưng tạo ra một danh sách gọi là colors rằng có giá trị giống như cm.YlOrRd, ngoài các 0 nhập cảnh, mà chúng tôi thiết lập để màu đen (0,0,0 trong rgb). Sau đó, chúng tôi sử dụng LinearSegmentedColormap.from_list để thực sự làm cho colormap:

import matplotlib 
from pylab import * 

data = np.arange(-50, 50).reshape(10, 10) 
data = np.abs(data) 
colors = [(0,0,0)] + [(cm.YlOrRd(i)) for i in xrange(1,256)] 
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256) 
pcolor(data, cmap=new_map) 
savefig('map.png') 
show() 

Điều này tạo ra những âm mưu tương tự, nhưng không có giá trị là đen:

enter image description here Dưới đây là cách khác sử dụng mảng đeo mặt nạ, một chút của mình tham gia nhiều hơn, các nhận xét trong mã giải thích các bước:

from pylab import * 
import numpy.ma as ma 

data=np.arange(-50,50).reshape(10,10) 
data=np.abs(data) 
#create a mask where only values=0 are true: 
mask = data == 0 
#create a masked array by combining our mask and data: 
mx = ma.masked_array(data, mask) 
#set masked values in cm.YlOrRd to 'black' 
cm.YlOrRd.set_bad(color='black', alpha=None) 
# pcolor(data,cmap=cm.YlOrRd) 
#we must use pcolormesh instead of pcolor, as pcolor does not draw masked values at all 
pcolormesh(mx,cmap=cm.YlOrRd) 
show() 

Điều này tạo ra lô giống như trên ngay lập tức.

Có một sự khác biệt tiềm năng giữa các phương pháp này, phương pháp đầu tiên sẽ làm tròn giá trị dữ liệu và áp dụng màu phù hợp, còn phương pháp thứ hai sẽ chỉ đặt giá trị bằng 0 thành đen (tức là 0,001 sẽ không bị che khuất) sẽ là màu cm.YlOrRd thích hợp). Ưu điểm chính của thứ hai là bạn có thể che giấu các mục hoàn toàn tùy ý.

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