2010-07-30 87 views
87

我有以下代码:设置彩条范围在matplotlib

import matplotlib.pyplot as plt 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

plt.clf() 
plt.pcolor(X, Y, v, cmap=cm) 
plt.loglog() 
plt.xlabel('X Axis') 
plt.ylabel('Y Axis') 

plt.colorbar() 
plt.show() 

因此,这会产生在轴X对y的值“V”的曲线图,使用指定的颜色表。的X和Y轴是完美的,但是V的min和max之间的传播颜色表我想强制颜色映射到范围0和1之间

我想用的:

plt.axis(...) 

设置坐标轴的范围,但这只需要X和Y的最小值和最大值的参数,而不是色彩图。

编辑:

为了清楚起见,假设我有一个图表,其值范围(0 ... 0.3),而另一个图表,其值(0.2〜0.8)。

在这两个图中,我都希望颜色条的范围是(0 ... 1)。在这两张图中,我希望使用上面所有的cdict全部范围来使这个范围的颜色相同(因此在这两个图中的0.25将是相同的颜色)。在第一张图中,0.3到1.0之间的所有颜色将不会在图中显示,但会在侧面的色彩键中显示。另一方面,0到0.2之间的所有颜色,以及0.8到1之间的所有颜色都不会在图中显示,但会在侧面的颜色栏中显示。

回答

114

使用vminvmax强制颜色的范围。这里有一个例子:

enter image description here

import matplotlib as m 
import matplotlib.pyplot as plt 
import numpy as np 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

x = np.arange(0, 10, .1) 
y = np.arange(0, 10, .1) 
X, Y = np.meshgrid(x,y) 

data = 2*(np.sin(X) + np.sin(3*Y)) 

def do_plot(n, f, title): 
    #plt.clf() 
    plt.subplot(1, 3, n) 
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4) 
    plt.title(title) 
    plt.colorbar() 

plt.figure() 
do_plot(1, lambda x:x, "all") 
do_plot(2, lambda x:np.clip(x, -4, 0), "<0") 
do_plot(3, lambda x:np.clip(x, 0, 4), ">0") 
plt.show() 
10

不知道这是最优雅的解决方案(这是我用什么),但你可以扩展您的数据为0的范围为1,然后修改颜色条:

import matplotlib as mpl 
... 
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5) 
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm, 
         norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5)) 
cbar.set_clim(-2.0, 2.0) 

随着两不同的限制可以控制颜色条的范围和图例。在此示例中,只显示-0.5至1.5之间的范围,而颜色图覆盖-2至2(因此,这可能是您在缩放之前记录的数据范围)。

因此,不是缩放颜色映射,而是缩放数据并使颜色条适合该颜色条。

+1

我认为这是做一些细微的差别......对不起,我可能是不够严谨在我的问题。 您的解决方案将缩放颜色,以便用于表示值1.0的值现在将代表我的数据中的最大值。颜色条会根据需要显示0..1(vmin = 0,vmax = 1),但高于此最大值的所有颜色都将是相同的颜色... – Paul 2010-07-30 20:59:34

+1

...我已更新我的问题以显示什么我更清楚了。对不起,如果我太模糊。 – Paul 2010-07-30 21:07:06

+0

但是,您的答案帮助我解决了我的问题! – punyidea 2016-05-26 15:49:15

39

使用CLIM功能(相当于MATLAB CAXIS功能):

plt.pcolor(X, Y, v, cmap=cm) 
plt.clim(-4,4) 
plt.show() 
+1

我相信clim()会缩放颜色轴,但颜色本身会更改值。无论规模如何,沿规模某个分数的点将是相同的颜色,但其代表的值将会改变。 – Paul 2010-08-01 17:55:10