Matplotlib 颜色映射和颜色使用详解

Matplotlib 颜色映射和颜色使用详解

参考:matplotlib cmap colors

MatplotlibPython 中最流行的数据可视化库之一,它提供了丰富的颜色映射(colormap)和颜色使用选项,使得数据可视化更加生动和富有表现力。本文将详细介绍 Matplotlib 中的颜色映射(cmap)和颜色使用方法,帮助读者更好地掌握这一强大工具。

1. 颜色映射(Colormap)简介

颜色映射是一种将数值范围映射到颜色范围的方法。在 Matplotlib 中,颜色映射通常用于表示连续数据的变化,如热图、等高线图等。Matplotlib 提供了多种内置的颜色映射,可以满足不同的可视化需求。

1.1 内置颜色映射

Matplotlib 提供了多种内置的颜色映射,可以分为以下几类:

  • 顺序颜色映射:如 ‘viridis’、’plasma’、’inferno’、’magma’ 等
  • 发散颜色映射:如 ‘coolwarm’、’RdYlBu’、’RdBu’ 等
  • 循环颜色映射:如 ‘hsv’、’twilight’、’twilight_shifted’ 等
  • 定性颜色映射:如 ‘Set1’、’Set2’、’Set3’、’Pastel1’ 等

以下是一个使用内置颜色映射的简单示例:

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 - Viridis Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 scatter 函数创建了一个散点图,并使用 viridis 颜色映射来表示 y 值的变化。colorbar 函数添加了一个颜色条,显示颜色与数值的对应关系。

1.2 自定义颜色映射

除了使用内置的颜色映射,Matplotlib 还允许用户创建自定义的颜色映射。以下是一个创建自定义颜色映射的示例:

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

# 创建自定义颜色映射
colors_list = ['#ff0000', '#00ff00', '#0000ff']
n_bins = 100
cmap = colors.LinearSegmentedColormap.from_list('How2matplotlib.com_custom_cmap', colors_list, N=n_bins)

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

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

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 colors.LinearSegmentedColormap.from_list 函数创建了一个自定义的颜色映射,该映射从红色过渡到绿色,再过渡到蓝色。然后,我们将这个自定义的颜色映射应用到散点图中。

2. 颜色映射的应用

颜色映射可以应用于多种类型的图表,下面我们将介绍几种常见的应用场景。

2.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='hot')
plt.colorbar(label='Value')
plt.title('How2matplotlib.com - Heatmap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 imshow 函数创建了一个热图,并使用 hot 颜色映射来表示数据的大小。热图可以直观地展示二维数据的分布情况,颜色越亮表示数值越大。

2.2 等高线图(Contour Plot)

等高线图是另一种常见的颜色映射应用,它可以用来表示三维数据在二维平面上的投影。以下是一个等高线图的示例:

import matplotlib.pyplot as plt
import numpy as np

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

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

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 contourf 函数创建了一个填充等高线图,并使用 coolwarm 颜色映射来表示 Z 值的变化。等高线图可以直观地展示三维数据在二维平面上的分布情况。

2.3 3D 表面图

颜色映射也可以应用于 3D 图形,以下是一个 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')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
fig.colorbar(surf, label='Z 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 颜色映射和颜色使用详解

在这个示例中,我们使用 plot_surface 函数创建了一个 3D 表面图,并使用 viridis 颜色映射来表示 Z 值的变化。3D 表面图可以直观地展示三维数据的分布情况。

3. 颜色使用技巧

除了颜色映射,Matplotlib 还提供了多种颜色使用方法,可以让你的图表更加丰富多彩。

3.1 使用颜色名称

Matplotlib 支持多种颜色名称,可以直接使用字符串来指定颜色。以下是一个使用颜色名称的示例:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y1, color='red', label='Sin(x)')
plt.plot(x, y2, color='blue', label='Cos(x)')
plt.title('How2matplotlib.com - Color Names Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 ‘red’ 和 ‘blue’ 颜色名称来分别绘制正弦和余弦曲线。Matplotlib 支持多种颜色名称,如 ‘green’、’yellow’、’purple’ 等。

3.2 使用 RGB 值

除了颜色名称,你还可以使用 RGB 值来指定颜色。RGB 值是一个包含红、绿、蓝三个分量的元组,每个分量的取值范围是 0 到 1。以下是一个使用 RGB 值的示例:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y1, color=(1, 0, 0), label='Sin(x)')  # 红色
plt.plot(x, y2, color=(0, 0, 1), label='Cos(x)')  # 蓝色
plt.title('How2matplotlib.com - RGB Color Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 (1, 0, 0) 表示红色,(0, 0, 1) 表示蓝色。你可以通过调整 RGB 值来创建各种颜色。

3.3 使用十六进制颜色代码

十六进制颜色代码是另一种常用的颜色表示方法。它使用 6 位十六进制数来表示颜色,前两位表示红色,中间两位表示绿色,最后两位表示蓝色。以下是一个使用十六进制颜色代码的示例:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y1, color='#FF0000', label='Sin(x)')  # 红色
plt.plot(x, y2, color='#0000FF', label='Cos(x)')  # 蓝色
plt.title('How2matplotlib.com - Hex Color Code Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 ‘#FF0000′ 表示红色,’#0000FF’ 表示蓝色。十六进制颜色代码提供了更精确的颜色控制。

3.4 使用 RGBA 值

RGBA 值是 RGB 值的扩展,增加了一个 Alpha 通道来控制透明度。Alpha 值的范围是 0(完全透明)到 1(完全不透明)。以下是一个使用 RGBA 值的示例:

import matplotlib.pyplot as plt
import numpy as np

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

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y1, color=(1, 0, 0, 0.5), label='Sin(x)')  # 半透明红色
plt.plot(x, y2, color=(0, 0, 1, 0.5), label='Cos(x)')  # 半透明蓝色
plt.title('How2matplotlib.com - RGBA Color Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 (1, 0, 0, 0.5) 表示半透明的红色,(0, 0, 1, 0.5) 表示半透明的蓝色。RGBA 值可以用来创建具有透明效果的图形元素。

4. 颜色循环

当你需要为多个数据系列设置不同的颜色时,可以使用 Matplotlib 的颜色循环功能。颜色循环会自动为每个数据系列分配不同的颜色。以下是一个使用颜色循环的示例:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = x**2

# 创建图形
plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='Sin(x)')
plt.plot(x, y2, label='Cos(x)')
plt.plot(x, y3, label='Tan(x)')
plt.plot(x, y4, label='x^2')
plt.title('How2matplotlib.com - Color Cycle Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们没有明确指定颜色,Matplotlib 会自动为每条曲线分配不同的颜色。

5. 颜色映射的归一化

在使用颜色映射时,有时需要对数据进行归一化处理,以便更好地映射到颜色范围。Matplotlib 提供了多种归一化方法,如线性归一化、对数归一化等。以下是一个使用对数归一化的示例:

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

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

# 创建图形
plt.figure(figsize=(10, 8))
contour = plt.contourf(X, Y, Z, cmap='viridis', norm=LogNorm())
plt.colorbar(contour, label='Z Value (Log Scale)')
plt.title('How2matplotlib.com - Log Normalized Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 LogNorm() 对数据进行对数归一化,这样可以更好地展示数据的变化范围,特别是当数据跨越多个数量级时。

6. 离散颜色映射

有时我们需要使用离散的颜色映射,而不是连续的颜色映射。Matplotlib 提供了 BoundaryNorm 类来创建离散的颜色映射。以下是一个使用离散颜色映射的示例:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm
from matplotlib.cm import get_cmap

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

# 创建离散颜色映射
levels = [-1, -0.5, 0, 0.5, 1]
cmap = get_cmap('RdYlBu')
norm = BoundaryNorm(levels, cmap.N)

# 创建图形
plt.figure(figsize=(10, 8))
contour = plt.contourf(X, Y, Z, levels=levels, cmap=cmap, norm=norm)
plt.colorbar(contour, label='Z Value')
plt.title('How2matplotlib.com - Discrete Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们使用 BoundaryNorm 创建了一个离散的颜色映射,将数据分为四个区间。这种方法在展示分类数据或需要强调特定数值范围时非常有用。

7. 颜色映射的反转

有时我们可能需要反转颜色映射的顺序。Matplotlib 提供了一种简单的方法来反转颜色映射,只需在颜色映射名称后添加 _r 后缀即可。以下是一个反转颜色映射的示例:

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, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 原始颜色映射
im1 = ax1.imshow(Z, cmap='viridis')
ax1.set_title('How2matplotlib.com - Original Viridis')
plt.colorbar(im1, ax=ax1)

# 反转颜色映射
im2 = ax2.imshow(Z, cmap='viridis_r')
ax2.set_title('How2matplotlib.com - Reversed Viridis')
plt.colorbar(im2, ax=ax2)

plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们创建了两个子图,一个使用原始的 ‘viridis’ 颜色映射,另一个使用反转的 ‘viridis_r’ 颜色映射。这种方法可以用于任何内置的颜色映射。

8. 颜色映射的裁剪

有时我们可能只想使用颜色映射的一部分。Matplotlib 允许我们通过 set_under()set_over() 方法来设置超出范围的颜色,以及通过 set_bad() 方法来设置无效数据的颜色。以下是一个示例:

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

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

# 创建自定义颜色映射
cmap = plt.get_cmap('viridis').copy()
cmap.set_under('red')
cmap.set_over('blue')

# 创建图形
plt.figure(figsize=(10, 8))
im = plt.imshow(Z, cmap=cmap, vmin=-0.5, vmax=0.5)
plt.colorbar(im, extend='both', label='Z Value')
plt.title('How2matplotlib.com - Clipped Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们创建了一个自定义的颜色映射,将小于 -0.5 的值设置为红色,大于 0.5 的值设置为蓝色。这种方法可以帮助我们强调特定范围的数据。

9. 颜色映射的插值

Matplotlib 允许我们在两个或多个颜色之间进行插值,创建自定义的颜色映射。以下是一个使用颜色插值的示例:

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

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

# 创建自定义颜色映射
colors = ['blue', 'white', 'red']
n_bins = 100
cmap = LinearSegmentedColormap.from_list('How2matplotlib.com_custom', colors, N=n_bins)

# 创建图形
plt.figure(figsize=(10, 8))
im = plt.imshow(Z, cmap=cmap)
plt.colorbar(im, label='Z Value')
plt.title('How2matplotlib.com - Interpolated Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们创建了一个从蓝色到白色再到红色的自定义颜色映射。这种方法可以用来创建符合特定需求的颜色映射。

10. 颜色映射的组合

有时我们可能需要将多个颜色映射组合在一起。Matplotlib 提供了 ListedColormap 类来实现这一功能。以下是一个组合颜色映射的示例:

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

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

# 创建组合颜色映射
cmap1 = plt.get_cmap('viridis')
cmap2 = plt.get_cmap('plasma')
newcolors = np.vstack((cmap1(np.linspace(0, 1, 128)),
                       cmap2(np.linspace(0, 1, 128))))
combined_cmap = ListedColormap(newcolors)

# 创建图形
plt.figure(figsize=(10, 8))
im = plt.imshow(Z, cmap=combined_cmap)
plt.colorbar(im, label='Z Value')
plt.title('How2matplotlib.com - Combined Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 颜色映射和颜色使用详解

在这个示例中,我们将 ‘viridis’ 和 ‘plasma’ 两个颜色映射组合在一起,创建了一个新的颜色映射。这种方法可以用来创建更复杂的颜色映射效果。

结论

Matplotlib 的颜色映射和颜色使用功能非常强大和灵活,可以帮助我们创建丰富多彩、富有表现力的数据可视化图表。通过本文介绍的各种技巧和方法,你可以更好地控制图表的颜色效果,使你的数据可视化更加生动和有说服力。

无论是使用内置的颜色映射,还是创建自定义的颜色映射,Matplotlib 都提供了丰富的选项和灵活的控制方法。通过合理使用颜色映射和颜色,你可以有效地突出重要信息,展示数据的分布和变化趋势,使你的数据可视化更加专业和有吸引力。

在实际应用中,选择合适的颜色映射和颜色使用方法需要考虑数据的特性、可视化的目的以及受众的需求。通过不断实践和尝试,你将能够熟练运用 Matplotlib 的颜色功能,创造出更加出色的数据可视化作品。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程