Matplotlib 简明教程
Matplotlib - Colormaps
Colormap (通常称为颜色表或调色板),它是一组按照特定顺序排列的颜色,用于直观地表示数据。查看下方的图片以供参考 −
在 Matplotlib 的上下文中,色彩图在各种绘图中将数值映射到颜色方面扮演着至关重要的角色。Matplotlib 提供内置色彩图和外部库(如 Palettable),甚至允许我们创建和操作我们自己的色彩图。
Colormaps in Matplotlib
Matplotlib 提供了许多内置色彩图,如“viridis”或“copper”,可通过 matplotlib.colormaps 容器访问它们。这是一个通用注册表实例,它返回一个色彩图对象。
Example
以下示例获取 Matplotlib 中所有已注册色彩图的列表。
from matplotlib import colormaps
print(list(colormaps))
['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', …]
Accessing Colormaps and their Values
你可以使用 matplotlib.colormaps['viridis'] 获取一个已命名的色彩图,并且它返回一个色彩图对象。获取色彩图对象后, يمكنك通过对色彩图重新采样来访问其值。在本例中, viridis 是一个色彩图对象,当传递一个介于 0 和 1 之间浮点数时,它从色彩图返回一个 RGBA 值。
Creating and Manipulating Colormaps
Matplotlib 提供创建或操作你自己的色彩图的灵活性。此过程涉及使用类 ListedColormap 或 LinearSegmentedColormap 。
Creating Colormaps with ListedColormap
ListedColormaps 类通过提供颜色规范列表或数组来创建自定义色彩图非常有用。你可以使用它来使用颜色名称或 RGB 值构建新的色彩图。
以下示例演示如何使用 ListedColormap 类和特定颜色名称创建自定义色彩图。
import matplotlib as mpl
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np
# Creating a ListedColormap from color names
colormaps = [ListedColormap(['rosybrown', 'gold', "crimson", "linen"])]
# Plotting examples
np.random.seed(19680801)
data = np.random.randn(30, 30)
n = len(colormaps)
fig, axs = plt.subplots(1, n, figsize=(7, 3), layout='constrained', squeeze=False)
for [ax, cmap] in zip(axs.flat, colormaps):
psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
fig.colorbar(psm, ax=ax)
plt.show()
执行上述程序时,你将得到以下输出:
Creating Colormaps with LinearSegmentedColormap
LinearSegmentedColormap 类通过指定锚点及其对应颜色允许更多控制。这允许创建具有插值值的色彩图。
以下示例演示如何使用 LinearSegmentedColormap 类和特定颜色名称列表创建自定义色彩图。
import matplotlib as mpl
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.pyplot as plt
import numpy as np
# Creating a LinearSegmentedColormap from a list
colors = ["rosybrown", "gold", "lawngreen", "linen"]
cmap_from_list = [LinearSegmentedColormap.from_list("SmoothCmap", colors)]
# Plotting examples
np.random.seed(19680801)
data = np.random.randn(30, 30)
n = len(cmap_from_list)
fig, axs = plt.subplots(1, n, figsize=(7, 3), layout='constrained', squeeze=False)
for [ax, cmap] in zip(axs.flat, cmap_from_list):
psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
fig.colorbar(psm, ax=ax)
plt.show()
执行上述程序时,你将得到以下输出:
Reversing Colormaps
可以通过使用 colormap.reversed() 方法来反转色彩图。这会创建一个新色彩图,该色彩图是原始色彩图的反转版本。
此示例生成原始色彩图及其反转版本的并排可视化。
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np
# Define a list of color values in hexadecimal format
colors = ["#bbffcc", "#a1fab4", "#41b6c4", "#2c7fb8", "#25abf4"]
# Create a ListedColormap with the specified colors
my_cmap = ListedColormap(colors, name="my_cmap")
# Create a reversed version of the colormap
my_cmap_r = my_cmap.reversed()
# Define a helper function to plot data with associated colormap
def plot_examples(colormaps):
np.random.seed(19680801)
data = np.random.randn(30, 30)
n = len(colormaps)
fig, axs = plt.subplots(1, n, figsize=(n * 2 + 2, 3), layout='constrained', squeeze=False)
for [ax, cmap] in zip(axs.flat, colormaps):
psm = ax.pcolormesh(data, cmap=cmap, rasterized=True, vmin=-4, vmax=4)
fig.colorbar(psm, ax=ax)
plt.show()
# Plot the original and reversed colormaps
plot_examples([my_cmap, my_cmap_r])
执行上述程序时,你将得到以下输出:
Changing the default colormap
要更改所有后续绘图的默认色彩图,你可以使用 mpl.rc() 来修改默认色彩图设置。
Example
这里有一个示例,通过修改全局 Matplotlib 设置来将默认色彩图更改为 RdYlBu_r ,如 mpl.rc('image', cmap='RdYlBu_r')。
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl
# Generate random data
data = np.random.rand(4, 4)
# Create a figure with two subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7, 4))
# Plot the first subplot with the default colormap
ax1.imshow(data)
ax1.set_title("Default colormap")
# Set the default colormap globally to 'RdYlBu_r'
mpl.rc('image', cmap='RdYlBu_r')
# Plot the modified default colormap
ax2.imshow(data)
ax2.set_title("Modified default colormap")
# Display the figure with both subplots
plt.show()
执行上述代码,我们将得到以下输出 −
Plotting Lines with Colors through Colormap
要通过色彩图绘制具有不同颜色的多条线条,你可以使用 Matplotlib 的 plot() 函数以及一个色彩图来将不同颜色分配给每条线条。
Example
以下示例通过迭代范围并在 plot() 函数中使用 color 参数用来自色彩图的不同颜色绘制每条线条来绘制多条线条。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
# Generate x and y data
x = np.linspace(0, 2 * np.pi, 64)
y = np.exp(x)
# Plot the initial line
plt.plot(x, y)
# Define the number of lines and create a colormap
n = 20
colors = plt.cm.rainbow(np.linspace(0, 1, n))
# Plot multiple lines with different colors using a loop
for i in range(n):
plt.plot(x, i * y, color=colors[i])
plt.xlim(4, 6)
plt.show()
执行上述代码,我们将得到以下输出 −