2013-05-22 17 views
4

我想創建一個僞彩色繪圖(例如contourcontourf)和一個顏色條。出於實際原因,我希望顏色條的範圍與底層的可映射不同。在不改變實際繪圖的情況下在matplotlib色條上設置限制

在下面的示例中,數據Z的範圍爲0到10000,它映射到色彩映射。顏色條的範圍是相同的。

import numpy 
from matplotlib import pyplot 

X = numpy.arange(100) 
Y = numpy.arange(100) 
Z = numpy.arange(100**2).reshape((100,100)) 

f = pyplot.figure() 
ax = f.gca() 
cf = ax.contourf(X,Y,Z,100) 
cbar = f.colorbar(cf, ticks=[3000,4000,5000,6000]) 

pyplot.show() 

plot

現在,我想「放大」的彩條,即產生3000〜6000只的範圍中的彩條。這個新的彩條仍然可以作爲圖例,併爲每個勾號給出適當的顏色(3000 =藍色,6000 =黃色)。 cbar.set_clim()cf.set_clim()都不能完成此操作。

回答

3

一般來說,抑制彩條的各個部分是一個壞主意,但這是一個超級黑客的方式。

import numpy 
from matplotlib import pyplot 

X = numpy.arange(100) 
Y = numpy.arange(100) 
Z = numpy.arange(100**2).reshape((100,100)) 

f = pyplot.figure() 
ax = f.gca() 
cf = ax.contourf(X,Y,Z,100) 
cbar = f.colorbar(cf, ticks=[3000,4000,5000,6000]) 
cbar.ax.set_ylim([cbar.norm(3000), cbar.norm(6000)]) 
cbar.outline.set_ydata([cbar.norm(3000)] * 2 + [cbar.norm(6000)] * 4 + [cbar.norm(3000)] * 3) 
cbar.ax.set_aspect(60) # <- tweak this to get the aspect ratio you want 
pyplot.show() 

我稱之爲hacky,因爲它涉及到一大堆顏色條內部。 cbar.outline是一個Line2D對象,它是圍繞着色條的黑框,set_ydata設置角上的ydata以匹配您要查看的子區域。嘗試一下,看看會發生什麼。

您可能想要查看色彩映射的clip功能。

+0

感謝您的回答。你介意解釋一下cbar.outline.set_ydata()的作用嗎? – Jan

+0

@Jan見編輯。在交互式會話中運行此代碼,並使用'__dict__','help'和'type'來稍微探索代碼。 – tacaswell

相關問題