Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

参考:matplotlib colormaps list

Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的色彩映射表(Colormaps)选项,使得数据可视化更加生动和富有表现力。本文将全面介绍 Matplotlib 中的色彩映射表,包括其概念、类型、使用方法以及如何选择合适的配色方案。我们将通过多个示例来展示如何在不同场景下应用色彩映射表,以提升数据可视化的效果和可读性。

1. 什么是色彩映射表(Colormaps)?

色彩映射表是一种将数值映射到颜色的函数或查找表。在数据可视化中,色彩映射表用于将数据值转换为相应的颜色,以便更直观地表示数据的分布、趋势或模式。Matplotlib 提供了多种预定义的色彩映射表,同时也允许用户自定义色彩映射表。

色彩映射表通常用于以下场景:

  1. 热图(Heatmaps)
  2. 等高线图(Contour plots)
  3. 散点图(Scatter plots)
  4. 3D 表面图(3D surface plots)
  5. 图像处理(Image processing)

让我们通过一个简单的示例来了解色彩映射表的基本用法:

import matplotlib.pyplot as plt
import numpy as np

# 创建一个简单的数据集
data = np.random.rand(10, 10)

# 创建一个图形和子图
fig, ax = plt.subplots(figsize=(8, 6))

# 使用 imshow 函数绘制热图,并应用 'viridis' 色彩映射表
im = ax.imshow(data, cmap='viridis')

# 添加颜色条
plt.colorbar(im)

# 设置标题
plt.title('How2matplotlib.com - Basic Colormap Example')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们使用 imshow 函数绘制了一个简单的热图,并应用了 ‘viridis’ 色彩映射表。plt.colorbar() 函数添加了一个颜色条,显示了数值和颜色之间的对应关系。

2. Matplotlib 中的色彩映射表类型

Matplotlib 提供了多种类型的色彩映射表,可以根据数据的特性和可视化的目的选择合适的类型。主要的色彩映射表类型包括:

  1. 顺序色彩映射表(Sequential colormaps)
  2. 发散色彩映射表(Diverging colormaps)
  3. 循环色彩映射表(Cyclic colormaps)
  4. 定性色彩映射表(Qualitative colormaps)

2.1 顺序色彩映射表

顺序色彩映射表适用于表示连续的数值范围,通常从浅色到深色或者从冷色到暖色渐变。这种类型的色彩映射表适合表示单一变量的变化趋势,如温度、高度或密度等。

常用的顺序色彩映射表包括:’viridis’、’plasma’、’inferno’、’magma’、’Blues’、’Greens’、’Reds’ 等。

让我们看一个使用顺序色彩映射表的例子:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8))

# 使用 contourf 函数绘制等高线填充图,并应用 'plasma' 色彩映射表
cs = ax.contourf(X, Y, Z, cmap='plasma', levels=20)

# 添加颜色条
plt.colorbar(cs)

# 设置标题
plt.title('How2matplotlib.com - Sequential Colormap Example')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们使用 contourf 函数绘制了一个等高线填充图,并应用了 ‘plasma’ 顺序色彩映射表。这种色彩映射表非常适合表示连续变化的数据,如这里的正弦余弦函数值。

2.2 发散色彩映射表

发散色彩映射表适用于表示具有自然中点或零点的数据,如温度偏差、相关系数或正负值。这种类型的色彩映射表通常在中点使用浅色或中性色,两端使用对比鲜明的深色。

常用的发散色彩映射表包括:’coolwarm’、’RdBu’、’BrBG’、’PiYG’、’PRGn’ 等。

下面是一个使用发散色彩映射表的示例:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)
Z = X * np.exp(-X**2 - Y**2)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8))

# 使用 pcolormesh 函数绘制伪彩色图,并应用 'coolwarm' 色彩映射表
pc = ax.pcolormesh(X, Y, Z, cmap='coolwarm', shading='auto')

# 添加颜色条
plt.colorbar(pc)

# 设置标题
plt.title('How2matplotlib.com - Diverging Colormap Example')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们使用 pcolormesh 函数绘制了一个伪彩色图,并应用了 ‘coolwarm’ 发散色彩映射表。这种色彩映射表非常适合表示具有正负值的数据,如这里的函数 Z = X * exp(-X^2 – Y^2),它在原点附近有正负值的变化。

2.3 循环色彩映射表

循环色彩映射表适用于表示周期性数据或角度数据,如相位、方向或时间周期。这种类型的色彩映射表的起点和终点颜色相同,形成一个闭环。

常用的循环色彩映射表包括:’hsv’、’twilight’、’twilight_shifted’、’cmrmap’ 等。

让我们看一个使用循环色彩映射表的例子:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
theta = np.linspace(0, 2*np.pi, 100)
r = np.linspace(0, 1, 50)
T, R = np.meshgrid(theta, r)
Z = np.cos(5*T)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw=dict(projection='polar'))

# 使用 pcolormesh 函数在极坐标系中绘制伪彩色图,并应用 'hsv' 色彩映射表
pc = ax.pcolormesh(T, R, Z, cmap='hsv', shading='auto')

# 添加颜色条
plt.colorbar(pc)

# 设置标题
plt.title('How2matplotlib.com - Cyclic Colormap Example')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们在极坐标系中使用 pcolormesh 函数绘制了一个伪彩色图,并应用了 ‘hsv’ 循环色彩映射表。这种色彩映射表非常适合表示周期性数据,如这里的余弦函数在极坐标系中的表示。

2.4 定性色彩映射表

定性色彩映射表适用于表示离散的、无序的类别数据。这种类型的色彩映射表使用一组互不相同的颜色,每种颜色代表一个类别。

常用的定性色彩映射表包括:’Set1’、’Set2’、’Set3’、’Pastel1’、’Pastel2’、’Paired’ 等。

下面是一个使用定性色彩映射表的示例:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
categories = ['A', 'B', 'C', 'D', 'E']
values = np.random.rand(5)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 6))

# 使用 bar 函数绘制条形图,并应用 'Set3' 色彩映射表
bars = ax.bar(categories, values, color=plt.cm.Set3(np.linspace(0, 1, len(categories))))

# 设置标题和标签
plt.title('How2matplotlib.com - Qualitative Colormap Example')
plt.xlabel('Categories')
plt.ylabel('Values')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们使用 bar 函数绘制了一个条形图,并应用了 ‘Set3’ 定性色彩映射表。这种色彩映射表非常适合表示不同类别的数据,每个类别用不同的颜色表示。

3. 如何选择合适的色彩映射表

选择合适的色彩映射表对于有效传达数据信息至关重要。以下是一些选择色彩映射表的建议:

  1. 考虑数据类型:
    • 对于连续数据,使用顺序色彩映射表
    • 对于有中心点的数据,使用发散色彩映射表
    • 对于周期性数据,使用循环色彩映射表
    • 对于类别数据,使用定性色彩映射表
  2. 考虑色觉缺陷:选择对色盲友好的色彩映射表,如 ‘viridis’、’plasma’、’inferno’ 等

  3. 考虑打印效果:如果需要打印,选择在灰度下仍有良好区分度的色彩映射表

  4. 避免彩虹色彩映射表:如 ‘jet’,因为它可能会产生误导性的感知

  5. 使用感知均匀的色彩映射表:如 ‘viridis’、’magma’ 等,它们在亮度和色调上的变化更加均匀

  6. 考虑数据范围:对于大范围数据,可能需要使用对数刻度的色彩映射表

让我们通过一个例子来比较不同色彩映射表的效果:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# 创建图形和子图
fig, axs = plt.subplots(2, 2, figsize=(12, 10))

# 使用不同的色彩映射表
cmaps = ['viridis', 'coolwarm', 'hsv', 'Set3']
titles = ['Viridis (Sequential)', 'Coolwarm (Diverging)', 'HSV (Cyclic)', 'Set3 (Qualitative)']

for ax, cmap, title in zip(axs.flat, cmaps, titles):
    im = ax.imshow(Z, cmap=cmap, extent=[-2, 2, -2, 2])
    ax.set_title(f'{title}\nHow2matplotlib.com')
    plt.colorbar(im, ax=ax)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子展示了同一数据集使用不同类型色彩映射表的效果。通过比较,我们可以看到不同色彩映射表如何影响数据的视觉表现。

4. 自定义色彩映射表

除了使用 Matplotlib 提供的预定义色彩映射表,我们还可以创建自定义的色彩映射表。这在需要特定颜色方案或想要强调某些数据范围时非常有用。

4.1 使用 LinearSegmentedColormap 创建自定义色彩映射表

LinearSegmentedColormap 允许我们通过定义颜色锚点来创建自定义的色彩映射表。以下是一个示例:

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

# 定义颜色锚点
colors_list = ['#ff0000', '#00ff00', '#0000ff']  # 红、绿、蓝
n_bins = 100  # 颜色数量
cmap_name = 'custom_div_cmap'

# 创建自定义色彩映射表
cm = colors.LinearSegmentedColormap.from_list(cmap_name, colors_list, N=n_bins)

# 创建数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8))

# 使用自定义色彩映射表绘制等高线填充图
cs = ax.contourf(X, Y, Z, cmap=cm, levels=20)

# 添加颜色条
plt.colorbar(cs)

# 设置标题
plt.title('How2matplotlib.com - Custom Linear Segmented Colormap')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

在这个例子中,我们创建了一个从红色到绿色再到蓝色的自定义色彩映射表。这种方法允许我们精确控制色彩映射表中的颜色和它们的过渡。

4.2 使用 ListedColormap 创建离散色彩映射表

对于需要离散颜色的情况,我们可以使用 ListedColormap。这在处理分类数据时特别有用。以下是一个示例:

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

# 定义颜色列表
color_list = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']

# 创建离散色彩映射表
cmap = colors.ListedColormap(color_list)

# 创建数据
data = np.random.randint(0, 4, (10, 10))

# 创建图形和子图
fig, ax = plt.subplots(figsize=(8, 6))

# 使用离散色彩映射表绘制热图
im = ax.imshow(data, cmap=cmap)

# 添加颜色条
cbar = plt.colorbar(im, ticks=[0.5, 1.5, 2.5, 3.5])
cbar.ax.set_yticklabels(['Category A', 'Category B', 'Category C', 'Category D'])

# 设置标题
plt.title('How2matplotlib.com - Discrete Colormap with ListedColormap')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子创建了一个包含四种颜色的离散色彩映射表,适用于表示四个不同的类别。

5. 色彩映射表的高级应用

5.1 使用 Normalize 对象调整色彩映射

有时我们需要调整色彩映射的范围或分布。Matplotlib 提供了 Normalize 对象来实现这一目的。以下是一个使用对数归一化的例子:

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

# 创建数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(X/2 + Y/2)

# 创建图形和子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 线性归一化
norm1 = colors.Normalize(vmin=Z.min(), vmax=Z.max())
im1 = ax1.imshow(Z, norm=norm1, cmap='viridis')
ax1.set_title('How2matplotlib.com - Linear Normalization')
plt.colorbar(im1, ax=ax1)

# 对数归一化
norm2 = colors.LogNorm(vmin=Z.min(), vmax=Z.max())
im2 = ax2.imshow(Z, norm=norm2, cmap='viridis')
ax2.set_title('How2matplotlib.com - Logarithmic Normalization')
plt.colorbar(im2, ax=ax2)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子展示了线性归一化和对数归一化对同一数据集的不同效果。对数归一化可以更好地显示数据中的小值变化。

5.2 使用 BoundaryNorm 创建不均匀间隔的色彩映射

对于需要不均匀间隔的色彩映射,我们可以使用 BoundaryNorm。这在强调特定数据范围时非常有用:

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

# 创建数据
x = np.linspace(-3, 3, 200)
y = np.linspace(-3, 3, 200)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# 定义不均匀的边界
bounds = [-1, -0.5, -0.2, 0, 0.2, 0.5, 1]

# 创建 BoundaryNorm 对象
norm = colors.BoundaryNorm(bounds, plt.get_cmap('RdYlBu').N)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8))

# 使用 BoundaryNorm 绘制等高线填充图
cs = ax.contourf(X, Y, Z, cmap='RdYlBu', norm=norm, levels=bounds)

# 添加颜色条
plt.colorbar(cs, ax=ax, extend='both')

# 设置标题
plt.title('How2matplotlib.com - Uneven Colormap with BoundaryNorm')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子创建了一个具有不均匀间隔的色彩映射,允许我们在特定的数值范围内使用更多的颜色。

6. 色彩映射表在不同类型图表中的应用

色彩映射表不仅可以用于热图和等高线图,还可以应用于多种其他类型的图表。让我们看一些例子:

6.1 在散点图中使用色彩映射表

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
np.random.seed(0)
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
sizes = 1000 * np.random.rand(100)

# 创建图形和子图
fig, ax = plt.subplots(figsize=(10, 8))

# 绘制散点图,使用 'viridis' 色彩映射表
scatter = ax.scatter(x, y, c=colors, s=sizes, cmap='viridis', alpha=0.6)

# 添加颜色条
plt.colorbar(scatter)

# 设置标题和标签
plt.title('How2matplotlib.com - Scatter Plot with Colormap')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子展示了如何在散点图中使用色彩映射表来表示第三个维度的数据。

6.2 在 3D 表面图中使用色彩映射表

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 创建图形和 3D 子图
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制 3D 表面图,使用 'plasma' 色彩映射表
surf = ax.plot_surface(X, Y, Z, cmap='plasma', linewidth=0, antialiased=False)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)

# 设置标题和标签
ax.set_title('How2matplotlib.com - 3D Surface Plot with Colormap')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

# 显示图形
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)全面指南:如何选择和使用合适的配色方案

这个例子展示了如何在 3D 表面图中使用色彩映射表来增强深度感知。

7. 色彩映射表的性能考虑

虽然色彩映射表可以大大提升数据可视化的效果,但在处理大型数据集时,它们可能会影响性能。以下是一些提高性能的建议:

  1. 使用 pcolormesh 而不是 imshow:对于大型 2D 数组,pcolormesh 通常比 imshow 更快。

  2. 减少颜色数量:使用 LinearSegmentedColormap.from_list 创建色彩映射表时,减少 N 参数的值可以降低内存使用。

  3. 使用 rasterized=True:在矢量图形中,将大型彩色对象栅格化可以减少文件大小。

  4. 考虑使用 Normalize 对象:预先计算归一化可以在多次绘图时提高效率。

8. 总结

Matplotlib 的色彩映射表是一个强大的工具,可以极大地提升数据可视化的效果和可读性。通过选择合适的色彩映射表类型,我们可以更好地传达数据中的信息和模式。本文介绍了色彩映射表的基本概念、类型、选择方法以及高级应用,并通过多个示例展示了如何在不同类型的图表中使用色彩映射表。

在实际应用中,选择合适的色彩映射表需要考虑数据的性质、可视化的目的以及受众的需求。通过合理使用色彩映射表,我们可以创建既美观又富有洞察力的数据可视化作品。

最后,建议读者多尝试不同的色彩映射表,并根据具体情况进行调整和优化。Matplotlib 提供的丰富功能和灵活性使得我们能够创建出既专业又富有表现力的数据可视化图表。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程