2011-10-24 60 views
34

我使用matplotlib在python中繪製一些數據,並且圖需要一個標準的顏色條。數據由一系列包含頻率信息的NxM矩陣組成,以便簡單的imshow()圖給出具有彩色描述頻率的2D直方圖。每個矩陣包含不同但重疊範圍內的數據。 Imshow將每個矩陣中的數據標準化爲0-1的範圍,這意味着例如矩陣A的繪圖將與矩陣2 * A的繪圖相同(儘管顏色欄將顯示值的兩倍)。例如,我想要的顏色是紅色,以對應於所有地塊中的相同頻率。換句話說,單一色條就足以滿足所有情節。任何建議將不勝感激。我如何創建一個標準的顏色條爲python

+1

我更喜歡使用matshow()或pcolor(),因爲imshow()在顯示時使平滑矩陣更困難。所以除非矩陣確實是一個圖像,否則我建議你試試其他兩個。 – ianalis

+2

@inalis - 如果不需要插值,可以在使用'imshow'時指定'interpolation ='nearest''。對於大型數組,'pcolor'比'imshow'慢得多,所以對大型數組使用'imshow'往往更好。另一方面,'pcolor'給出矢量輸出,有時候這可能非常方便。 –

+0

[Matplotlib 2 Subplots,1 Colorbar]可能的副本(http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar) –

回答

8

最簡單的解決方法是用每個圖的相同參數調用clim(lower_limit,upper_limit)。

+4

或者只是將'vmin'和'vmax' kwargs傳遞給' imshow'。 –

68

不偷@ ianilis的答案,但我想補充一個例子...

有多種方式,但最簡單的就是指定vminvmax kwargs到imshow。或者,您可以製作一個matplotlib.cm.Colormap實例並指定它,但這對於簡單情況來說比複雜得多。

這裏有一個簡單的例子對所有圖像的單個彩條:

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

這唯一的答案一半的問題,或者更確切地說,開始一個新的。 如果更改

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] 

您的彩條會從0到0.5,在這種情況下是深藍色稍微淡藍色,並且不會覆蓋整個範圍(0〜2) 。 無論vminvmax如何,顏色條只會顯示最後一張圖像或輪廓中的顏色。

相關問題