Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

参考:matplotlib colormaps names

Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的色彩映射表(Colormaps)选项,可以帮助我们更好地展示数据。本文将深入探讨 Matplotlib 中的色彩映射表,包括其名称、使用方法和自定义技巧。

1. 什么是色彩映射表?

色彩映射表是一种将数值映射到颜色的方法。在数据可视化中,我们经常需要使用不同的颜色来表示数据的不同值或范围。色彩映射表提供了一种系统化的方法来实现这一目标。

Matplotlib 提供了多种预定义的色彩映射表,每个都有其独特的名称和特点。这些色彩映射表可以分为几个主要类别:

  • 顺序色彩映射表(Sequential colormaps)
  • 发散色彩映射表(Diverging colormaps)
  • 循环色彩映射表(Cyclic colormaps)
  • 定性色彩映射表(Qualitative colormaps)

让我们通过一个简单的例子来看看如何使用色彩映射表:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建图形
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=y, cmap='viridis')
plt.colorbar(label='Sin(x)')
plt.title('How2matplotlib.com: Simple Colormap Example')
plt.xlabel('X')
plt.ylabel('Sin(x)')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

在这个例子中,我们使用了 ‘viridis’ 色彩映射表来表示 sin 函数的值。scatter 函数的 c 参数指定了用于着色的数据,cmap 参数指定了使用的色彩映射表。

2. Matplotlib 中的预定义色彩映射表

Matplotlib 提供了大量预定义的色彩映射表。以下是一些常用的色彩映射表及其特点:

2.1 顺序色彩映射表

顺序色彩映射表适用于表示从低到高或从高到低的连续数据。

  • viridis:从深蓝到黄的渐变,是 Matplotlib 的默认色彩映射表
  • plasma:从深紫到黄的渐变
  • inferno:从黑到黄的渐变
  • magma:从黑到白的渐变,经过紫红色

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

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, axs = plt.subplots(2, 2, figsize=(12, 10))
cmaps = ['viridis', 'plasma', 'inferno', 'magma']

for ax, cmap in zip(axs.flat, cmaps):
    im = ax.imshow(Z, cmap=cmap, origin='lower')
    ax.set_title(f'How2matplotlib.com: {cmap}')
    fig.colorbar(im, ax=ax)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了四种不同的顺序色彩映射表在同一数据集上的效果。

2.2 发散色彩映射表

发散色彩映射表适用于表示具有明确中心点或零点的数据,例如温度偏差或相关性。

  • coolwarm:从冷色(蓝)到暖色(红)的渐变
  • RdBu:从红到蓝的渐变
  • BrBG:从棕色到绿色的渐变
  • PiYG:从粉红到黄绿的渐变

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

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, axs = plt.subplots(2, 2, figsize=(12, 10))
cmaps = ['coolwarm', 'RdBu', 'BrBG', 'PiYG']

for ax, cmap in zip(axs.flat, cmaps):
    im = ax.imshow(Z, cmap=cmap, origin='lower', extent=[-2, 2, -2, 2])
    ax.set_title(f'How2matplotlib.com: {cmap}')
    fig.colorbar(im, ax=ax)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了四种不同的发散色彩映射表在同一数据集上的效果。

2.3 循环色彩映射表

循环色彩映射表适用于表示周期性数据,如角度或时间。

  • hsv:色相饱和度值(Hue-Saturation-Value)循环
  • twilight:柔和的循环色彩映射表
  • twilight_shifted:twilight 的移位版本

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

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, axs = plt.subplots(1, 3, figsize=(15, 5), subplot_kw=dict(projection='polar'))
cmaps = ['hsv', 'twilight', 'twilight_shifted']

for ax, cmap in zip(axs, cmaps):
    im = ax.pcolormesh(T, R, Z, cmap=cmap)
    ax.set_title(f'How2matplotlib.com: {cmap}')
    fig.colorbar(im, ax=ax)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了三种不同的循环色彩映射表在极坐标系中的效果。

2.4 定性色彩映射表

定性色彩映射表适用于表示离散的、无序的数据类别。

  • Set1, Set2, Set3:不同大小的颜色集合
  • Pastel1, Pastel2:柔和的颜色集合
  • Paired:成对的颜色集合

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

import matplotlib.pyplot as plt
import numpy as np

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

# 创建子图
fig, axs = plt.subplots(2, 3, figsize=(15, 10))
cmaps = ['Set1', 'Set2', 'Set3', 'Pastel1', 'Pastel2', 'Paired']

for ax, cmap in zip(axs.flat, cmaps):
    colors = plt.cm.get_cmap(cmap)(np.linspace(0, 1, len(categories)))
    ax.bar(categories, values, color=colors)
    ax.set_title(f'How2matplotlib.com: {cmap}')
    ax.set_ylim(0, 1)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了六种不同的定性色彩映射表在条形图中的效果。

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

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

  1. 对于连续数据,使用顺序色彩映射表。
  2. 对于具有自然中点的数据,使用发散色彩映射表。
  3. 对于周期性数据,使用循环色彩映射表。
  4. 对于分类数据,使用定性色彩映射表。
  5. 考虑色盲友好的色彩映射表,如 viridis、plasma 或 cividis。
  6. 避免使用彩虹色彩映射表(如 jet),因为它可能会误导观众。

让我们通过一个例子来说明如何为不同类型的数据选择合适的色彩映射表:

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)

Z1 = np.exp(-(X-5)**2/10 - (Y-5)**2/10)  # 连续数据
Z2 = X - Y  # 具有自然中点的数据
Z3 = np.sin(X) * np.cos(Y)  # 周期性数据

# 创建子图
fig, axs = plt.subplots(1, 3, figsize=(15, 5))

# 连续数据使用顺序色彩映射表
im1 = axs[0].imshow(Z1, cmap='viridis', extent=[0, 10, 0, 10])
axs[0].set_title('How2matplotlib.com: Continuous Data (viridis)')
fig.colorbar(im1, ax=axs[0])

# 具有自然中点的数据使用发散色彩映射表
im2 = axs[1].imshow(Z2, cmap='coolwarm', extent=[0, 10, 0, 10])
axs[1].set_title('How2matplotlib.com: Diverging Data (coolwarm)')
fig.colorbar(im2, ax=axs[1])

# 周期性数据使用循环色彩映射表
im3 = axs[2].imshow(Z3, cmap='hsv', extent=[0, 10, 0, 10])
axs[2].set_title('How2matplotlib.com: Periodic Data (hsv)')
fig.colorbar(im3, ax=axs[2])

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了如何为不同类型的数据选择合适的色彩映射表。

4. 如何使用色彩映射表

在 Matplotlib 中,我们可以通过多种方式使用色彩映射表:

4.1 在绘图函数中直接使用

许多 Matplotlib 绘图函数都接受 cmap 参数,我们可以直接指定色彩映射表的名称:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建图形
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=y, cmap='viridis')
plt.colorbar(label='Sin(x)')
plt.title('How2matplotlib.com: Direct Use of Colormap')
plt.xlabel('X')
plt.ylabel('Sin(x)')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

在这个例子中,我们直接在 scatter 函数中使用了 ‘viridis’ 色彩映射表。

4.2 使用 plt.cm 获取色彩映射表对象

我们可以使用 plt.cm 获取色彩映射表对象,然后使用它来获取特定的颜色:

import matplotlib.pyplot as plt
import numpy as np

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

# 获取色彩映射表对象
cmap = plt.cm.get_cmap('Set1')

# 创建图形
plt.figure(figsize=(10, 6))
plt.bar(categories, values, color=cmap(np.linspace(0, 1, 5)))
plt.title('How2matplotlib.com: Using plt.cm to Get Colormap')
plt.xlabel('Categories')
plt.ylabel('Values')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

在这个例子中,我们使用 plt.cm.get_cmap 获取了 ‘Set1’ 色彩映射表对象,然后使用它来为每个条形指定颜色。

4.3 使用 Normalize 对象进行颜色映射

我们可以使用 Normalize 对象来控制数据值如何映射到色彩映射表:

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

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Normalize 对象
norm = colors.Normalize(vmin=-1, vmax=1)

# 创建图形
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=y, cmap='RdYlBu', norm=norm)
plt.colorbar(label='Sin(x)')
plt.title('How2matplotlib.com: Using Normalize Object')
plt.xlabel('X')
plt.ylabel('Sin(x)')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

在这个例子中,我们使用 Normalize 对象将数据值限制在 -1 到 1 的范围内,这对于 sin 函数来说是合适的。

5. 自定义色彩映射表

除了使用预定义的色彩映射表,我们还可以创建自定义的色彩映射表。

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

我们可以使用 LinearSegmentedColormap 创建自定义的色彩映射表:

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

# 定义颜色列表
colors_list = ['blue', 'white', 'red']

# 创建自定义色彩映射表
n_bins = 100
cmap = colors.LinearSegmentedColormap.from_list('How2matplotlib.com_custom', colors_list, N=n_bins)

# 创建数据
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)

# 创建图形
plt.figure(figsize=(10, 8))
plt.imshow(Z, cmap=cmap, extent=[-2, 2, -2, 2])
plt.colorbar(label='Value')
plt.title('How2matplotlib.com: Custom Colormap')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

在这个例子中,我们创建了一个从蓝色到白色再到红色的自定义色彩映射表。

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

对于离散的数据,我们可以使用 ListedColormap 创建自定义的色彩映射表:

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

# 定义颜色列表
colors_list = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99']

# 创建自定义色彩映射表
cmap = colors.ListedColormap(colors_list)

# 创建数据
categories = ['A', 'B', 'C', 'D']
values = np.random.randint(0, 4, 100)

# 创建图形
plt.figure(figsize=(10, 6))
plt.scatter(np.random.rand(100), np.random.rand(100), c=values, cmap=cmap)
plt.colorbar(ticks=[0.5, 1.5, 2.5, 3.5], label='Categories')
plt.colorbar().set_ticklabels(categories)
plt.title('How2matplotlib.com: Discrete Custom Colormap')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

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

6. 色彩映射表的反转和截断

有时我们可能需要反转色彩映射表的顺序或只使用其中的一部分。

6.1 反转色彩映射表

我们可以通过在色彩映射表名称后添加 ‘_r’ 来反转色彩映射表:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 原始色彩映射表
im1 = ax1.scatter(x, y, c=y, cmap='viridis')
ax1.set_title('How2matplotlib.com: Original Viridis')
fig.colorbar(im1, ax=ax1)

# 反转的色彩映射表
im2 = ax2.scatter(x, y, c=y, cmap='viridis_r')
ax2.set_title('How2matplotlib.com: Reversed Viridis')
fig.colorbar(im2, ax=ax2)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了原始的 ‘viridis’ 色彩映射表和反转后的 ‘viridis_r’ 色彩映射表。

6.2 截断色彩映射表

我们可以使用 colors.Colormap.from_list() 方法来截断色彩映射表:

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

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 获取原始色彩映射表
original_cmap = plt.cm.get_cmap('viridis')

# 创建截断的色彩映射表
truncated_cmap = colors.LinearSegmentedColormap.from_list(
    'How2matplotlib.com_trunc', original_cmap(np.linspace(0.2, 0.8, 100)))

# 创建子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 原始色彩映射表
im1 = ax1.scatter(x, y, c=y, cmap=original_cmap)
ax1.set_title('How2matplotlib.com: Original Viridis')
fig.colorbar(im1, ax=ax1)

# 截断的色彩映射表
im2 = ax2.scatter(x, y, c=y, cmap=truncated_cmap)
ax2.set_title('How2matplotlib.com: Truncated Viridis')
fig.colorbar(im2, ax=ax2)

plt.tight_layout()
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子展示了原始的 ‘viridis’ 色彩映射表和截断后的版本。截断的版本只使用了原始色彩映射表 20% 到 80% 的范围。

7. 色彩映射表的应用场景

色彩映射表在数据可视化中有广泛的应用。以下是一些常见的应用场景:

7.1 热图(Heatmap)

热图是色彩映射表最常见的应用之一,用于显示二维数据的强度:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
data = np.random.rand(10, 10)

# 创建热图
plt.figure(figsize=(10, 8))
plt.imshow(data, cmap='YlOrRd')
plt.colorbar(label='Value')
plt.title('How2matplotlib.com: Heatmap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子创建了一个使用 ‘YlOrRd’ 色彩映射表的热图。

7.2 等高线图(Contour Plot)

等高线图使用色彩映射表来表示三维表面:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建等高线图
plt.figure(figsize=(10, 8))
cs = plt.contourf(X, Y, Z, cmap='coolwarm', levels=20)
plt.colorbar(cs, label='Value')
plt.title('How2matplotlib.com: Contour Plot Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子创建了一个使用 ‘coolwarm’ 色彩映射表的等高线图。

7.3 3D 表面图

色彩映射表也可以应用于 3D 表面图:

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

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

# 创建 3D 表面图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
fig.colorbar(surf, label='Value')
ax.set_title('How2matplotlib.com: 3D Surface Plot Example')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

Output:

Matplotlib 色彩映射表(Colormaps)详解:名称、使用和自定义

这个例子创建了一个使用 ‘viridis’ 色彩映射表的 3D 表面图。

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

虽然色彩映射表可以大大提高数据可视化的效果,但在处理大量数据时也需要考虑性能问题。以下是一些提高性能的建议:

  1. 使用 imshow() 而不是 scatter() 来绘制大量点。
  2. 对于静态图像,考虑使用 savefig() 保存为图片文件,而不是在交互环境中显示。
  3. 使用 rasterized=True 参数来栅格化图形元素,这可以减少文件大小。
  4. 对于大型数据集,考虑在绘图之前对数据进行下采样或聚合。

9. 总结

Matplotlib 的色彩映射表是一个强大的工具,可以帮助我们更有效地可视化数据。通过选择合适的色彩映射表,我们可以突出数据的重要特征,使图表更易于理解和解释。

本文详细介绍了 Matplotlib 中的各种色彩映射表,包括它们的名称、类型和使用方法。我们还讨论了如何选择合适的色彩映射表,如何创建自定义色彩映射表,以及如何在不同的图表类型中应用色彩映射表。

通过掌握这些知识,你将能够创建更加专业和有洞察力的数据可视化。记住,选择正确的色彩映射表不仅可以使你的图表更美观,还可以更准确地传达数据中的信息。

在实际应用中,建议多尝试不同的色彩映射表,并根据数据的特性和可视化的目的来选择最合适的一个。同时,也要考虑到色盲友好性和打印效果等因素。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程