2013-08-01 106 views
16

我想製作4個imshow子圖但它們都共享相同的色圖。 Matplotlib根據矩陣的條目自動調整色彩圖上的比例。例如,如果其中一個矩陣的所有條目都爲10,另一個矩陣的條目全部爲5,並且我使用Greys色彩映射表,那麼我的一個子圖應該是全黑的,另一個應該是完全灰色的。但他們都變成了完全黑人。如何使所有子圖在色圖上共享相同的比例尺?Imshow具有相同色條的子圖

+0

看來這篇文章有一個可以幫助你的答案。 http://stackoverflow.com/questions/3373256/set-colorbar-range-in-matplotlib – bserra

+0

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

回答

27

要得到這個正確的圖像,你需要把所有圖像的亮度等級都一樣,否則顏色就沒有意義了。爲此,請使用imshow()的參數vminvmax,並確保它們對於所有圖像都是相同的。

例如,如果你想顯示的值的範圍從0到10,可以使用以下命令:

import pylab as plt 
import numpy as np 
my_image1 = np.linspace(0, 10, 10000).reshape(100,100) 
my_image2 = np.sqrt(my_image1.T) + 3 
subplot(1, 2, 1) 
plt.imshow(my_image1, vmin=0, vmax=10, cmap='jet', aspect='auto') 
plt.subplot(1, 2, 2) 
plt.imshow(my_image2, vmin=0, vmax=10, cmap='jet', aspect='auto') 
plt.colorbar() 

enter image description here

+0

不是很漂亮,因爲第二軸更窄,請參閱http://stackoverflow.com/questions/13784201/matplotlib-2-subplots-1-colorbar而不是 –

+0

@RuggeroTurra是的,但這是因爲'方面='auto''並且可以通過改變子圖空間(或者例如gridspec)進行調整。在接受的答案中,您將顏色條連接起來也不像軸線那麼高,所以仍然需要進行一些調整。 – tiago

1

這可能是因爲你不知道事先您的數據範圍,但您可能知道它們以某種方式兼容。在這種情況下,您可能更願意讓matplotlib爲第一個繪圖選擇這些範圍,併爲剩餘的繪圖使用相同的範圍。這是你如何做到的。關鍵是要得到極限properties()['clim']

import numpy as np 
import matplotlib.pyplot as plt 

my_image1 = np.linspace(0, 10, 10000).reshape(100,100) 
my_image2 = np.sqrt(my_image1.T) + 3 

fig, axes = plt.subplots(nrows=1, ncols=2) 
im = axes[0].imshow(my_image1) 
clim=im.properties()['clim'] 
axes[1].imshow(my_image2, clim=clim) 

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.5) 

plt.show() 
+0

如果第一個繪圖中的值範圍小於第二個繪圖中的範圍,那麼這不起作用。 – naught101

+0

同意。但這正是我在文中解釋的。如果你不知道最佳範圍,但是你認爲第一個圖的自動範圍適合其餘的範圍,這將起作用。 –

相關問題