2010-07-30 36 views
87

Tôi có đoạn mã sau:Set Colorbar cấp ở matplotlib

import matplotlib.pyplot as plt 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

plt.clf() 
plt.pcolor(X, Y, v, cmap=cm) 
plt.loglog() 
plt.xlabel('X Axis') 
plt.ylabel('Y Axis') 

plt.colorbar() 
plt.show() 

Vì vậy, điều này tạo ra một đồ thị của các giá trị 'v' trên các trục X vs Y, bằng cách sử dụng bản đồ màu quy định. X và Y trục là hoàn hảo, nhưng colormap lây lan giữa min và max của v Tôi muốn buộc các colormap để dao động giữa 0 và 1.

Tôi nghĩ của việc sử dụng:.

plt.axis(...) 

Để đặt phạm vi của các trục, nhưng điều này chỉ lấy đối số cho min và max của X và Y, không phải là bản đồ màu.

Edit:

Để rõ ràng, chúng ta hãy nói rằng tôi có một đồ thị có giá trị nằm trong khoảng (0 ... 0.3) và tạo biểu đồ khác có giá trị (0,2 ... 0,8).

Trong cả hai biểu đồ, tôi sẽ muốn phạm vi của thanh màu là (0 ... 1). Trong cả hai biểu đồ, tôi muốn phạm vi màu này giống hệt nhau bằng cách sử dụng phạm vi đầy đủ của cdict ở trên (vì vậy 0,25 trong cả hai biểu đồ sẽ có cùng màu). Trong đồ thị đầu tiên, tất cả các màu giữa 0,3 và 1,0 sẽ không có trong biểu đồ, nhưng sẽ có trong phím colourbar ở bên cạnh. Mặt khác, tất cả các màu từ 0 đến 0,2 và giữa 0,8 và 1 sẽ không có trong biểu đồ, nhưng sẽ có trong thanh màu ở bên cạnh.

Trả lời

114

Sử dụng vminvmax buộc phạm vi cho màu sắc. Dưới đây là một ví dụ:

enter image description here

import matplotlib as m 
import matplotlib.pyplot as plt 
import numpy as np 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

x = np.arange(0, 10, .1) 
y = np.arange(0, 10, .1) 
X, Y = np.meshgrid(x,y) 

data = 2*(np.sin(X) + np.sin(3*Y)) 

def do_plot(n, f, title): 
    #plt.clf() 
    plt.subplot(1, 3, n) 
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4) 
    plt.title(title) 
    plt.colorbar() 

plt.figure() 
do_plot(1, lambda x:x, "all") 
do_plot(2, lambda x:np.clip(x, -4, 0), "<0") 
do_plot(3, lambda x:np.clip(x, 0, 4), ">0") 
plt.show() 
10

Không chắc nếu đây là giải pháp thanh lịch nhất (đây là những gì tôi được sử dụng), nhưng bạn có thể mở rộng dữ liệu của mình vào khoảng từ 0 đến 1 và sau đó sửa đổi colorbar:

import matplotlib as mpl 
... 
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5) 
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm, 
         norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5)) 
cbar.set_clim(-2.0, 2.0) 

Với hai giới hạn khác nhau, bạn có thể kiểm soát phạm vi và chú thích của thanh màu. Trong ví dụ này chỉ phạm vi từ -0,5 đến 1,5 được hiển thị trong thanh, trong khi bản đồ màu bao gồm từ -2 đến 2 (vì vậy đây có thể là phạm vi dữ liệu của bạn, mà bạn ghi lại trước khi mở rộng).

Vì vậy, thay vì mở rộng bản đồ màu, bạn chia tỷ lệ dữ liệu của mình và phù hợp với thanh màu đó.

+1

Tôi nghĩ đó là làm một cái gì đó tinh tế khác nhau ... xin lỗi tôi có lẽ không chính xác đủ trong câu hỏi của tôi. Giải pháp của bạn sẽ mở rộng màu để những gì được sử dụng để biểu thị giá trị 1.0 giờ đây sẽ đại diện cho giá trị tối đa trong dữ liệu của tôi. Thanh màu sẽ hiển thị 0..1 khi tôi cần nó (với vmin = 0, vmax = 1), nhưng mọi thứ trên giá trị tối đa này sẽ có cùng một màu ... – Paul

+1

... Tôi đã cập nhật câu hỏi của mình để hiển thị cái gì Tôi sau khi rõ ràng hơn. Xin lỗi nếu tôi quá mơ hồ. – Paul

+0

Câu trả lời của bạn đã giúp tôi giải quyết vấn đề của mình, tuy nhiên! – punyidea

39

Sử dụng CLIM chức năng (tương đương với CAXIS hàm trong MATLAB):

plt.pcolor(X, Y, v, cmap=cm) 
plt.clim(-4,4) 
plt.show() 
+1

Tôi tin rằng clim() chia tỷ lệ trục màu, nhưng chính màu sắc sẽ thay đổi giá trị. Điểm tại một phần nhất định dọc theo tỷ lệ sẽ có cùng màu bất kể thang tỷ lệ, nhưng giá trị nó đại diện sẽ thay đổi. – Paul

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