2015-09-24 55 views
4

我使用下面的脚本用于绘图:如何与绝对值定义的颜色表与matplotlib

import matplotlib 

import matplotlib.pyplot as plt 
import numpy as np 
import pylab as pl 
import math 
import matplotlib as mpl 
from matplotlib.ticker import MultipleLocator 
from matplotlib.colors import LinearSegmentedColormap 

cdict1 = {'red': ((0.0, 1.0, 1.0), 
        (0.4, 1.0, 1.0), 
        (0.7, 0.0, 0.0), 
        (1.0, 0.0, 0.0)), 

     'green': ((0.0, 1.0, 1.0), 
        (0.1, 0.0, 0.0), 
        (1.0, 0.0, 0.0)), 

     'blue': ((0.0, 1.0, 1.0), 
        (0.1, 0.0, 0.0), 
        (0.4, 0.0, 0.0), 
        (1.0, 1.0, 1.0)) 
     } 

white_blue_red = LinearSegmentedColormap('WhiteBlueRed', cdict1) 
plt.register_cmap(cmap=white_blue_red) 

x = np.loadtxt('data.dat', 
       unpack=True) 

plt.scatter(x[0], x[1], marker='.', s=3, linewidths=0, c=x[3], cmap= \ 
      plt.get_cmap('WhiteBlueRed')) # plt.cm.bwr 
plt.colorbar() 

plt.show() 

我已经定义的颜色映射使用相对值(函数1最大值的0最小值)。问题是我想使用该代码绘制数百个不同的文件,并且我希望每个绘图都具有完全相同的颜色映射。有没有可能用绝对值定义色彩映射?这将解决我的问题。

回答

6

在这种情况下的关键是norm,而不是颜色映射。

该颜色图定义的颜色已经缩放数据。 norm将数据缩放到0-1范围。

缺省情况下,Normalize实例将被创建的数据vminvmax kwargs,如果它们被提供的min和max之间缩放。

但是,有一些不同的帮助函数可能对您的情况有用。

如果你想有一个离散的彩条,还有一个辅助功能可以同时生成norm和你cmapmatplotlib.colors.from_levels_and_colors这需要值列表和一个颜色列表,并返回一个BoundaryNorm实例和LinearSegmentedColormap实例:

例如:

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

data1 = 3 * np.random.random((10, 10)) 
data2 = 5 * np.random.random((10, 10)) 

levels = [0, 1, 2, 3, 4, 5] 
colors = ['red', 'brown', 'yellow', 'green', 'blue'] 
cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors) 

fig, axes = plt.subplots(ncols=2) 
for ax, dat in zip(axes, [data1, data2]): 
    im = ax.imshow(dat, cmap=cmap, norm=norm, interpolation='none') 
    fig.colorbar(im, ax=ax, orientation='horizontal') 
plt.show() 

enter image description here

注意,这产生了离散的颜色表。

如果我们想用一个连续的颜色表代替,我们可以指定同一vminvmax参数或创建自己的Normalize实例,并在将它作为norm参数的所有图像。

此外,还有一个类似的功能,从颜色列表中创建一个连续的颜色表:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap 

data1 = 3 * np.random.random((10, 10)) 
data2 = 5 * np.random.random((10, 10)) 

colors = ['red', 'brown', 'yellow', 'green', 'blue'] 
cmap = LinearSegmentedColormap.from_list('name', colors) 
norm = plt.Normalize(0, 5) 

fig, axes = plt.subplots(ncols=2) 
for ax, dat in zip(axes, [data1, data2]): 
    im = ax.imshow(dat, cmap=cmap, norm=norm, interpolation='none') 
    fig.colorbar(im, ax=ax, orientation='horizontal') 
plt.show() 

enter image description here

相关问题