如何使用 matplotlib 定义具有绝对值的颜色图
how to define colormap with absolute values with 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()
我定义的颜色图使用相对值(0函数的最小值1最大值)。问题是我想使用该代码绘制数百个不同的文件,并且我希望每个图都具有完全相同的颜色图。是否可以用绝对值定义颜色图?那会解决我的问题。
本例中的关键是 norm
,而不是颜色图。
颜色图定义了已缩放数据的颜色。 norm
将数据缩放到 0-1 范围。
默认情况下,将创建一个 Normalize
实例,它在数据的最小值和最大值之间缩放 或 vmin
和 vmax
kwargs,如果提供的话。
但是,有一些不同的辅助函数可能对您的情况有用。
如果你想要一个离散的颜色条,有一个辅助函数可以为你生成一个 norm
和一个 cmap
:matplotlib.colors.from_levels_and_colors
它需要一个值列表和一个列表颜色和 returns 一个 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()
请注意,这会创建一个离散的颜色图。
如果我们想使用连续的颜色图,我们可以指定相同的 vmin
和 vmax
参数,或者创建我们自己的 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()
我使用以下脚本进行绘图:
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最大值)。问题是我想使用该代码绘制数百个不同的文件,并且我希望每个图都具有完全相同的颜色图。是否可以用绝对值定义颜色图?那会解决我的问题。
本例中的关键是 norm
,而不是颜色图。
颜色图定义了已缩放数据的颜色。 norm
将数据缩放到 0-1 范围。
默认情况下,将创建一个 Normalize
实例,它在数据的最小值和最大值之间缩放 或 vmin
和 vmax
kwargs,如果提供的话。
但是,有一些不同的辅助函数可能对您的情况有用。
如果你想要一个离散的颜色条,有一个辅助函数可以为你生成一个 norm
和一个 cmap
:matplotlib.colors.from_levels_and_colors
它需要一个值列表和一个列表颜色和 returns 一个 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()
请注意,这会创建一个离散的颜色图。
如果我们想使用连续的颜色图,我们可以指定相同的 vmin
和 vmax
参数,或者创建我们自己的 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()