2011-10-24 35 views
34

Tôi sử dụng matplotlib để vẽ một số dữ liệu trong python và các ô yêu cầu thanh màu chuẩn. Dữ liệu bao gồm một loạt các ma trận NxM chứa thông tin tần số để một ô imshow() đơn giản cung cấp một biểu đồ 2D với tần số mô tả màu. Mỗi ma trận chứa dữ liệu khác nhau, nhưng phạm vi chồng chéo. Imshow bình thường hóa dữ liệu trong mỗi ma trận đến phạm vi 0-1 có nghĩa là, ví dụ, cốt truyện của ma trận A, sẽ xuất hiện giống với cốt truyện của ma trận 2 * A (mặc dù thanh màu sẽ hiển thị gấp đôi giá trị). Những gì tôi muốn là cho màu đỏ, ví dụ, để tương ứng với cùng một tần số trong tất cả các lô. Nói cách khác, một thanh màu đơn sẽ đủ cho tất cả các ô. Bất kỳ đề xuất sẽ được đánh giá rất cao.Làm thế nào tôi có thể tạo một thanh màu chuẩn cho một loạt các ô trong python

+1

Tôi thích sử dụng matshow() hoặc pcolor() vì imshow() làm mịn ma trận khi hiển thị việc diễn giải khó hơn. Vì vậy, trừ khi ma trận thực sự là một hình ảnh, tôi đề nghị bạn hãy thử hai cái kia. – ianalis

+2

@inalis - Bạn có thể chỉ định 'interpolation = 'recent'' khi sử dụng' imshow' nếu bạn không muốn nội suy. 'pcolor' chậm hơn nhiều so với' imshow' cho mảng lớn, vì vậy tốt hơn nên sử dụng 'imshow' cho mảng lớn-ish. Mặt khác, 'pcolor' cho đầu ra vectơ, có thể rất tiện dụng vào những lúc. –

+0

có thể trùng lặp của [Matplotlib 2 Subplots, 1 Colorbar] (http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar) –

Trả lời

8

Giải pháp dễ nhất là gọi mức độ cao (lower_limit, upper_limit) với cùng các đối số cho từng ô.

+4

Hoặc chỉ cần chuyển 'vmin' và' vmax' kwargs sang ' imshow'. –

68

Không để ăn cắp @ câu trả lời ianilis, nhưng tôi muốn thêm một ví dụ ...

Có nhiều cách, nhưng đơn giản nhất là chỉ để xác định vminvmax kwargs để imshow. Cách khác, bạn có thể tạo một cá thể matplotlib.cm.Colormap và chỉ định nó, nhưng điều đó phức tạp hơn mức cần thiết cho các trường hợp đơn giản.

Dưới đây là một ví dụ nhanh với một colorbar duy nhất cho tất cả hình ảnh:

import numpy as np 
import matplotlib.pyplot as plt 

# Generate some data that where each slice has a different range 
# (The overall range is from 0 to 2) 
data = np.random.random((4,10,10)) 
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None] 

# Plot each slice as an independent subplot 
fig, axes = plt.subplots(nrows=2, ncols=2) 
for dat, ax in zip(data, axes.flat): 
    # The vmin and vmax arguments specify the color limits 
    im = ax.imshow(dat, vmin=0, vmax=2) 

# Make an axis for the colorbar on the right side 
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8]) 
fig.colorbar(im, cax=cax) 

plt.show() 

enter image description here

1

này chỉ trả lời một nửa số câu hỏi, hay đúng hơn là bắt đầu một cái mới. Nếu bạn thay đổi

data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None] 

để

data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None] 

colorbar của bạn sẽ đi 0-0,5 mà trong trường hợp này là màu xanh đậm để hơi nhẹ hơn màu xanh và sẽ không bao gồm toàn bộ phạm vi (0-2) . Thanh màu sẽ chỉ hiển thị màu từ hình ảnh hoặc đường viền cuối cùng bất kể vminvmax.

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