如何使用matplotlib定义绝对值的颜色映射

6
我使用以下脚本进行绘图:
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()

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

1个回答

18

在这种情况下,关键是norm,而不是颜色地图。

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

默认情况下,如果提供了vminvmax参数,则会创建一个Normalize实例,该实例在数据的最小值和最大值之间进行缩放它们之间进行缩放。

但是,在您的情况下可能有一些不同的辅助函数会很有用。

如果您想要离散的颜色条,那么有一个辅助函数可以为您生成normcmap: matplotlib.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()

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接