2014-02-22 232 views
9

我見過這麼多例子,只是不適用於我的情況。我想要做的是爲一個彩條設置一個簡單的最小值和最大值。設置圖像cmap的範圍很簡單,但這不會將相同的範圍應用於顏色條的最小值和最大值。 下面的代碼可以解釋:在matplotlib中設置顏色條上的限制

triang = Triangulation(x,y) 
plt.tricontourf(triang, z, vmax=1., vmin=0.) 
plt.colorbar() 

的彩條仍固定於數據z的限制,雖然CMAP範圍現在固定在0和1

回答

11

I propose you incorporate you plot in a fig之間並從該樣品中得到啓示使用你看,你可以設置bounds的顏色在顏色條和扁蝨的彩條

data = np.tile(np.arange(4), 2) 
fig = plt.figure() 
ax = fig.add_subplot(121) 
cax = fig.add_subplot(122) 
cmap = colors.ListedColormap(['b','g','y','r']) 
bounds=[0,1,2,3,4] 
norm = colors.BoundaryNorm(bounds, cmap.N) 
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm) 
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds, 
    ticks=[0.5,1.5,2.5,3.5],) 
plt.show() 

這不是你想要達到的目標,但是對無花果的暗示可能有幫助。

This other one uses ticks以及定義顏色條的比例。

import numpy as np 
import matplotlib.pyplot as plt 

xi = np.array([0., 0.5, 1.0]) 
yi = np.array([0., 0.5, 1.0]) 
zi = np.array([[0., 1.0, 2.0], 
       [0., 1.0, 2.0], 
       [-0.1, 1.0, 2.0]]) 

v = np.linspace(-.1, 2.0, 15, endpoint=True) 
plt.contour(xi, yi, zi, v, linewidths=0.5, colors='k') 
plt.contourf(xi, yi, zi, v, cmap=plt.cm.jet) 
x = plt.colorbar(ticks=v) 
print x 
plt.show() 
+0

太好了!這工作。我早些時候嘗試過,但錯過了plt.contourf裏面的v。這就是爲什麼它不起作用。非常感激。 –

1

我遇到了同樣的問題,並提出了一個具體的(雖然毫無意義)這個問題的例子。註釋contourf命令將創建一個與數據具有相同邊界的顏色條,而不是顏色限制。

tricontourf的關卡選項似乎是解決此問題的好方法,但它需要extend ='both'選項才能包含超出圖中等級的值。

import matplotlib.tri as mtri 
import numpy as np 
from numpy.random import randn 
from matplotlib import colors 

numpy.random.seed(0) 
x = randn(300) 
y = randn(300) 
z = randn(*x.shape) 
triangles = mtri.Triangulation(x, y) 
bounds=np.linspace(-1,1,10) 
# sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1.) 
sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1., levels = bounds,\ 
        extend = 'both') 
cb = colorbar(sc) 
_ = ylim(-2,2) 
_ = xlim(-2,2) 
5

我認爲這個問題指出了一個錯誤,但它變成了一個使用/兼容性約束。解決方案是創建所需顏色條範圍的輪廓,並使用kwarg。欲瞭解更多信息,請看this issue。由於@tcaswell提供此解決方案:

import matplotlib.pyplot as plt 
import numpy as np 

x, y = np.mgrid[0:1:0.01, 0:1:0.01] 
r = np.sqrt(x ** 2 + y ** 2) 
z = np.sin(6 * np.pi * r) 

fig0, ax0 = plt.subplots(1, 1,) 
cf0 = ax0.contourf(x, y, z, np.arange(0, .5, .01), 
        extend='both') 
cbar0 = plt.colorbar(cf0,) 

enter image description here

從這裏,如果你不喜歡的彩條刻度,你可以用cbar0.set_ticks調整。我已經證實,這也適用於tricontourf

我簡化了@ tcaswell的代碼,以獲得所需的結果。此外,他使用了新的viridis色彩映射表,但希望你能明白。

+1

什麼原因導致色條變得尖銳? – jkokorian

+0

顏色條上的尖端提示表示數據仍在繼續,但輪廓線着色停止。你可以用'extend' kwarg來控制這些提示的存在,但要知道如果你不使用它,你不會在你指定的範圍之外有任何顏色(輪廓)。 – farenorth

2

這可能是最簡單的方法。

...(你的代碼如圖所示)

plt.colorbar(boundaries=np.linspace(0,1,5)) 

...