2012-03-14 36 views
35

Tôi có một hình ảnh đơn giản mà tôi đang hiển thị với imshow trong matplotlib. Tôi muốn áp dụng một bản đồ màu tùy chỉnh để các giá trị từ 0 đến 5 có màu trắng, 5-10 màu đỏ (các màu rất đơn giản), v.v. Tôi đã thử làm theo hướng dẫn sau:Xác định một bản đồ rời rạc cho imshow trong matplotlib

http://assorted-experience.blogspot.com/2007/07/custom-colormaps.html với mã sau:

cdict = { 
'red' : ((0., 0., 0.), (0.5, 0.25, 0.25), (1., 1., 1.)), 
'green': ((0., 1., 1.), (0.7, 0.0, 0.5), (1., 1., 1.)), 
'blue' : ((0., 1., 1.), (0.5, 0.0, 0.0), (1., 1., 1.)) 
} 

my_cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 3) 

plt.imshow(num_stars, extent=(min(x), max(x), min(y), max(y)), cmap=my_cmap) 
plt.show() 

Nhưng điều này kết thúc hiển thị màu lạ và tôi chỉ cần 3-4 màu mà tôi muốn xác định. Làm thế nào để tôi làm điều này?

+0

câu hỏi tương tự: http://stackoverflow.com/questions/9451545/using-matplotlib-to-draw-color-bar-with-distinguishable-and-uncontinues-colors/9451776#9451776 –

Trả lời

64

Bạn có thể sử dụng một ListedColormap để xác định màu trắng và màu đỏ là màu sắc duy nhất trong bản đồ màu sắc, và các giới hạn xác định nơi chuyển tiếp là từ một màu tiếp theo:

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

np.random.seed(101) 
zvals = np.random.rand(100, 100) * 10 

# make a color map of fixed colors 
cmap = colors.ListedColormap(['white', 'red']) 
bounds=[0,5,10] 
norm = colors.BoundaryNorm(bounds, cmap.N) 

# tell imshow about color map so that only set colors are used 
img = plt.imshow(zvals, interpolation='nearest', origin='lower', 
        cmap=cmap, norm=norm) 

# make a color bar 
plt.colorbar(img, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0, 5, 10]) 

plt.savefig('redwhite.png') 
plt.show() 

Con số kết quả có chỉ có hai màu sắc:

enter image description here

về cơ bản tôi đã đề nghị điều tương tự cho một câu hỏi hơi khác: 2D grid data visualization in Python

Giải pháp được lấy cảm hứng từ matplotlib example. Ví dụ giải thích rằng bounds phải nhiều hơn số màu được sử dụng.

BoundaryNorm là chuẩn hóa bản đồ một chuỗi giá trị thành số nguyên, sau đó được sử dụng để gán màu tương ứng. cmap.N, trong ví dụ trên, chỉ xác định số lượng màu.

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