2016-01-22 144 views
1

我想繪製matplotlib中摺疊更改的熱圖,其中顏色繪製在log2刻度上,並自定義哪些刻度顯示在顏色條上。我嘗試了以下內容:在matplotlib中製作log2縮放熱圖

import matplotlib.pylab as plt 
import numpy as np 
import matplotlib.colors 
from matplotlib.colors import SymLogNorm, LogNorm 

mat1 = np.clip(np.random.normal(20, 10, [20, 20]), a_min=0, a_max=500) 
mat2 = np.clip(np.random.normal(10, 5, [20, 20]), a_min=0, a_max=500) 
mat = np.clip(mat1/mat2, a_min=0, a_max=500) 
plt.figure() 
print mat 
cmap = plt.cm.get_cmap("seismic") 
ticks = np.array([1/float(50), 1/float(20), 1, 20, 50]) 
# how to make these ticks spaced out on a log2 and not log10 scale? 
plt.pcolormesh(mat, cmap=cmap, norm=SymLogNorm(linthresh=0.01, vmin=1/50., vmax=50.)) 
p = plt.colorbar(ticks=ticks) 
plt.show() 

我希望倍數變化1顯示爲白色,因此我使用了地震顏色映射。

問題:如何使顏色在log2範圍內間隔,而不是log10?還有蜱顯示爲log2值而不是未記錄的值?

如果我嘗試使用LogNorm代替SymLogNorm那麼刻度標記和我的蜱不顯示:

# This does not work -- ticks do not show 
plt.pcolormesh(mat, cmap=cmap, norm=LogNorm(vmin=1/50., vmax=50.)) 
p = plt.colorbar(ticks=ticks) 

我知道SymLogNorm是爲負的數據(我沒有)。我只用它,因爲這個問題打勾與LogNorm

+0

如果你想對你的彩條的值的對數,你爲什麼不只是展現您的數據的對數? – Christoph

回答

0

您可以在colorbar對象的locator設置爲LogLocator具有2的基礎,然後你需要調用p.update_ticks()

plt.pcolormesh(mat, cmap=cmap, norm=SymLogNorm(linthresh=0.01, vmin=1/50., vmax=50.)) 

p = plt.colorbar() 
p.locator=ticker.LogLocator(base=2) 
p.update_ticks() 

enter image description here

+0

這是否意味着1的log2單位和2的log2單位之間的顏色差異是雙倍的?即2的單位是1的單位的紅色的兩倍? (相對於2的單位比單位1多紅10倍) – mvd