2.2 颜色系统与色彩映射


文档摘要

2.2 颜色系统与色彩映射 Matplotlib 进阶绘图:深入颜色系统与色彩映射 在数据可视化中,颜色扮演着至关重要的角色。它不仅能提升图表的美观性,更能有效地帮助我们编码数据,揭示隐藏在数据背后的模式和洞见。Matplotlib,作为 Python 中最流行的绘图库之一,提供了强大而灵活的颜色系统和色彩映射机制,允许用户精细地控制图表的颜色呈现,从而创建更具表现力和信息量的可视化作品。 2.2 颜色系统与色彩映射 2.2.1 Matplotlib 中的颜色表示 Matplotlib 提供了多种方式来指定颜色,以满足不同的需求和偏好。理解这些颜色表示方法是掌握 Matplotlib 颜色系统的基础。

2.2 颜色系统与色彩映射

Matplotlib 进阶绘图:深入颜色系统与色彩映射

在数据可视化中,颜色扮演着至关重要的角色。它不仅能提升图表的美观性,更能有效地帮助我们编码数据,揭示隐藏在数据背后的模式和洞见。Matplotlib,作为 Python 中最流行的绘图库之一,提供了强大而灵活的颜色系统和色彩映射机制,允许用户精细地控制图表的颜色呈现,从而创建更具表现力和信息量的可视化作品。

2.2 颜色系统与色彩映射

2.2.1 Matplotlib 中的颜色表示

Matplotlib 提供了多种方式来指定颜色,以满足不同的需求和偏好。理解这些颜色表示方法是掌握 Matplotlib 颜色系统的基础。

1. RGB 和 RGBA 颜色

RGB (Red, Green, Blue) 是最常见的颜色模型之一,它通过红、绿、蓝三种颜色的不同强度组合来表示各种颜色。在 Matplotlib 中,RGB 颜色可以通过包含三个浮点数的元组或列表来表示,每个数值的范围是 0 到 1,代表对应颜色的强度。例如:

  • (1, 0, 0):纯红色

  • (0, 1, 0):纯绿色

  • (0, 0, 1):纯蓝色

  • (0.5, 0.5, 0.5):灰色

  • (0.2, 0.6, 0.8):一种浅蓝色

RGBA (Red, Green, Blue, Alpha) 在 RGB 的基础上增加了 Alpha 通道,用于控制颜色的透明度。Alpha 值也是一个 0 到 1 之间的浮点数,0 代表完全透明,1 代表完全不透明。RGBA 颜色可以使用包含四个浮点数的元组或列表表示。例如:

  • (1, 0, 0, 0.5):半透明的红色

  • (0, 1, 0, 1):完全不透明的绿色

代码实践 2.2.1.1:使用 RGB 和 RGBA 颜色

import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) # RGB 颜色示例 plt.plot([1, 2, 3, 4], [2, 4, 1, 3], color=(1, 0, 0), linewidth=2, label='RGB Red') # 红色 plt.plot([1, 2, 3, 4], [3, 1, 4, 2], color=(0, 0.5, 0), linewidth=2, label='RGB Green (half intensity)') # 半强度绿色 # RGBA 颜色示例 plt.scatter([1.5, 2.5, 3.5], [2.5, 3.5, 1.5], color=(0, 0, 1, 0.7), s=200, label='RGBA Blue (70% opacity)') # 70% 透明度蓝色 plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.title('RGB and RGBA Color Examples') plt.legend() plt.grid(True) plt.show()

代码详解 2.2.1.1:

这段代码演示了如何在 Matplotlib 中使用 RGB 和 RGBA 颜色。

  • plt.plot(..., color=(1, 0, 0), ...)plt.plot(..., color=(0, 0.5, 0), ...) 分别绘制了红色和半强度绿色的线条,颜色通过 RGB 元组 (R, G, B) 指定。

  • plt.scatter(..., color=(0, 0, 1, 0.7), ...) 绘制了蓝色的散点,颜色通过 RGBA 元组 (R, G, B, A) 指定,其中 Alpha 值 0.7 表示 70% 的不透明度。

Mermaid 图 2.2.1.1:RGB 和 RGBA 颜色模型

图表解释 2.2.1.1:

  • RGB 颜色模型: 展示了 RGB 颜色模型的基本组成,通过调整红色 (R)、绿色 (G) 和蓝色 (B) 三个分量的强度,可以混合出各种颜色,最终输出到显示设备。

  • RGBA 颜色模型: 在 RGB 模型的基础上,RGBA 模型加入了 Alpha (A) 通道,用于控制颜色的透明度。这使得颜色不仅具有色彩信息,还具备了透明度属性,增强了视觉表达的灵活性。

2. 十六进制颜色码 (Hex Color Codes)

十六进制颜色码是一种常用的网页颜色表示方法,它使用 6 位十六进制数来表示 RGB 颜色,或者 8 位十六进制数来表示 RGBA 颜色。在 Matplotlib 中,你可以直接使用十六进制颜色码字符串来指定颜色,以 # 开头。

  • #RRGGBB:表示 RGB 颜色,RR, GG, BB 分别是两位十六进制数,代表红色、绿色和蓝色的强度,范围从 00 (最小强度) 到 FF (最大强度)。

  • #RRGGBBAA:表示 RGBA 颜色,AA 是两位十六进制数,代表 Alpha 通道的值,00 代表完全透明,FF 代表完全不透明。

例如:

  • #FF0000:纯红色

  • #00FF00:纯绿色

  • #0000FF:纯蓝色

  • #808080:灰色

  • #3399CC:一种浅蓝色

  • #FF000080:半透明的红色

代码实践 2.2.1.2:使用十六进制颜色码

import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.plot([1, 2, 3, 4], [2, 4, 1, 3], color='#FF0000', linewidth=2, label='Hex Red') # 十六进制红色 plt.plot([1, 2, 3, 4], [3, 1, 4, 2], color='#008000', linewidth=2, label='Hex Green (half intensity)') # 十六进制半强度绿色 plt.scatter([1.5, 2.5, 3.5], [2.5, 3.5, 1.5], color='#0000FF80', s=200, label='Hex Blue (50% opacity)') # 十六进制 50% 透明度蓝色 plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.title('Hex Color Code Examples') plt.legend() plt.grid(True) plt.show()

代码详解 2.2.1.2:

这段代码展示了如何使用十六进制颜色码在 Matplotlib 中指定颜色。

  • plt.plot(..., color='#FF0000', ...) 使用 #FF0000 (红色) 十六进制码定义线条颜色。

  • plt.plot(..., color='#008000', ...) 使用 #008000 (半强度绿色) 十六进制码。

  • plt.scatter(..., color='#0000FF80', ...) 使用 #0000FF80 (50% 透明度蓝色) 十六进制码,其中最后的 80 代表 Alpha 通道的十六进制值 (十进制为 128,约为 255 的一半,即 50% 透明度)。

3. 灰度色彩 (Grayscale Colors)

灰度色彩表示从黑色到白色的过渡色,中间包含不同深浅的灰色。在 Matplotlib 中,灰度颜色可以通过字符串形式的灰度值来指定,范围从 '0' (黑色) 到 '1' (白色),或者使用浮点数 0 到 1 表示,其中 0 是黑色,1 是白色。

例如:

  • '0'0:黑色

  • '0.5'0.5:中灰色

  • '1'1:白色

  • '0.25'0.25:深灰色

  • '0.75'0.75:浅灰色

代码实践 2.2.1.3:使用灰度色彩

import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.plot([1, 2, 3, 4], [2, 4, 1, 3], color='0', linewidth=3, label='Black Line') # 黑色线条 plt.plot([1, 2, 3, 4], [3, 1, 4, 2], color='0.5', linewidth=3, linestyle='--', label='Gray Dashed Line') # 灰色虚线 plt.scatter([2, 3], [3, 2], color='0.8', s=300, marker='o', label='Light Gray Circle') # 浅灰色圆点 plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.title('Grayscale Color Examples') plt.legend() plt.grid(True) plt.show()

代码详解 2.2.1.3:

这段代码展示了如何在 Matplotlib 中使用灰度色彩。

  • plt.plot(..., color='0', ...) 使用字符串 '0' 指定黑色线条。

  • plt.plot(..., color='0.5', ...) 使用字符串 '0.5' 指定灰色虚线。

  • plt.scatter(..., color='0.8', ...) 使用字符串 '0.8' 指定浅灰色散点。

4. 命名颜色 (Named Colors)

Matplotlib 预定义了许多命名颜色,这些颜色名称来源于 CSS 颜色名称、X11/X Windows 系统颜色名称等等。你可以直接使用这些颜色名称的字符串来指定颜色,例如 'red', 'blue', 'green', 'purple', 'cyan', 'magenta', 'yellow', 'black', 'white' 等等。Matplotlib 还支持一些更具体的命名颜色,例如 'lightcoral', 'darkseagreen', 'skyblue' 等。

你可以通过 matplotlib.colors.CSS4_COLORSmatplotlib.colors.XKCD_COLORS 查看 Matplotlib 支持的所有命名颜色。

代码实践 2.2.1.4:使用命名颜色

import matplotlib.pyplot as plt import matplotlib.colors as mcolors plt.figure(figsize=(10, 6)) plt.plot([1, 2, 3, 4], [2, 4, 1, 3], color='skyblue', linewidth=2, label='Skyblue Line') # 天蓝色线条 plt.scatter([1.5, 2.5, 3.5], [2.5, 3.5, 1.5], color='forestgreen', s=200, label='Forestgreen Scatter') # 森林绿散点 plt.bar([1, 2, 3], [3, 2, 4], color='coral', label='Coral Bars') # 珊瑚色柱状图 plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.title('Named Color Examples') plt.legend() plt.grid(True) # 打印部分命名颜色示例 print("Example Named Colors:") named_colors = list(mcolors.CSS4_COLORS.keys())[:10] # 取前 10 个 CSS4 命名颜色作为例子 for color_name in named_colors: print(f"- {color_name}") plt.show()

代码详解 2.2.1.4:

这段代码演示了如何使用 Matplotlib 的命名颜色。

  • plt.plot(..., color='skyblue', ...) 使用命名颜色 'skyblue' 指定线条颜色。

  • plt.scatter(..., color='forestgreen', ...) 使用命名颜色 'forestgreen' 指定散点颜色。

  • plt.bar(..., color='coral', ...) 使用命名颜色 'coral' 指定柱状图颜色。

  • 代码还打印了 Matplotlib CSS4_COLORS 中的前 10 个命名颜色作为示例,你可以查阅 mcolors.CSS4_COLORSmcolors.XKCD_COLORS 查看完整的命名颜色列表。

2.2.2 色彩映射 (Colormaps)

色彩映射 (Colormap),也称为颜色图谱或调色板,是将数据值映射到颜色的一种机制。在 Matplotlib 中,色彩映射主要用于将标量数据(例如二维数组、等高线高度值等)转换为颜色,以便在图表中以颜色梯度的方式呈现数据变化。

Matplotlib 提供了丰富的预定义色彩映射方案,并且允许用户自定义色彩映射。色彩映射对于可视化数据分布、突出数据特征、增强图表信息量至关重要。

1. 预定义的色彩映射方案

Matplotlib 预定义了多种色彩映射方案,这些方案大致可以分为以下几类:

  • 顺序 (Sequential) 色彩映射: 适用于表示有序数据,颜色从浅到深或从深到浅连续变化,例如 'viridis', 'magma', 'Greys', 'Blues', 'YlGnBu' 等。

  • 发散 (Diverging) 色彩映射: 适用于表示数据围绕一个中心值发散的情况,颜色从中心值向两端发散变化,例如 'coolwarm', 'RdBu', 'PiYG', 'seismic' 等。

  • 循环 (Cyclic) 色彩映射: 适用于表示循环数据,例如角度、时间等,颜色首尾相接形成循环,例如 'twilight', 'hsv', 'phase' 等。

  • 定性 (Qualitative) 色彩映射: 适用于表示类别数据,颜色之间差异明显,用于区分不同的类别,例如 'Set1', 'Set2', 'Paired', 'tab10' 等。

你可以通过字符串名称来引用 Matplotlib 的预定义色彩映射,例如 cmap='viridis', cmap='coolwarm', cmap='tab20' 等。

代码实践 2.2.2.1:使用预定义的色彩映射

import matplotlib.pyplot as plt import numpy as np # 生成示例数据 data = np.random.rand(10, 10) fig, axes = plt.subplots(2, 2, figsize=(10, 8)) axes = axes.flatten() # 将 2x2 axes 数组展平为 1D 数组 # 顺序色彩映射 im1 = axes[0].imshow(data, cmap='viridis') axes[0].set_title('Sequential Colormap: Viridis') fig.colorbar(im1, ax=axes[0]) # 添加颜色条 # 发散色彩映射 im2 = axes[1].imshow(data, cmap='coolwarm') axes[1].set_title('Diverging Colormap: Coolwarm') fig.colorbar(im2, ax=axes[1]) # 定性色彩映射 (不完全适用,但演示用法) im3 = axes[2].imshow(data, cmap='tab10') axes[2].set_title('Qualitative Colormap: Tab10 (for demonstration)') fig.colorbar(im3, ax=axes[2]) # 灰度色彩映射 im4 = axes[3].imshow(data, cmap='gray') axes[3].set_title('Grayscale Colormap: Gray') fig.colorbar(im4, ax=axes[3]) plt.tight_layout() # 调整子图布局,避免重叠 plt.show()

代码详解 2.2.2.1:

这段代码演示了如何使用 Matplotlib 的预定义色彩映射方案。

  • np.random.rand(10, 10) 生成一个 10x10 的随机数据数组作为示例数据。

  • plt.imshow(data, cmap='viridis') 使用 imshow 函数显示数据,并通过 cmap='viridis' 指定使用 'viridis' 顺序色彩映射。

  • fig.colorbar(im1, ax=axes[0]) 添加颜色条,显示颜色与数据值的对应关系。

  • 代码分别使用了 'viridis' (顺序), 'coolwarm' (发散), 'tab10' (定性), 和 'gray' (灰度) 色彩映射,展示了不同类型色彩映射的应用效果。注意,定性色彩映射通常不适用于连续数据,这里仅为演示 cmap 参数的用法。

Mermaid 图 2.2.2.1:色彩映射的分类

图表解释 2.2.2.1:

  • 色彩映射分类: 展示了 Matplotlib 色彩映射的主要分类:顺序 (Sequential)、发散 (Diverging)、循环 (Cyclic) 和定性 (Qualitative)。

  • 示例色彩映射: 列举了每个类别下的一些常用色彩映射方案,例如 'viridis', 'coolwarm', 'twilight', 'Set1' 等,以及用 [...] 表示的更多方案。

2. 自定义色彩映射方案

除了预定义的色彩映射,Matplotlib 还允许用户创建自定义的色彩映射方案,以满足特定的可视化需求。自定义色彩映射主要通过两种方式实现:

  • ListedColormap 基于颜色列表创建离散的色彩映射。

  • LinearSegmentedColormap 基于颜色段定义线性插值的色彩映射。

a. ListedColormap

ListedColormap 允许你指定一个颜色列表,创建一个离散的色彩映射。它将数据值映射到颜色列表中的颜色,通常用于表示类别数据或者需要颜色分层的可视化。

代码实践 2.2.2.2.a:使用 ListedColormap 创建自定义色彩映射

import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import numpy as np # 自定义颜色列表 colors = ['lightcoral', 'skyblue', 'lightgreen', 'gold'] cmap_name = 'MyListedColormap' my_cmap = ListedColormap(colors, name=cmap_name) # 创建 ListedColormap 对象 # 示例数据 (假设是类别数据) data = np.random.randint(0, len(colors), size=(10, 10)) # 生成 0-3 的整数矩阵 plt.figure(figsize=(8, 6)) im = plt.imshow(data, cmap=my_cmap, interpolation='nearest') # 使用自定义色彩映射,interpolation='nearest' 避免颜色插值 plt.title('Custom ListedColormap') plt.colorbar(im, ticks=np.arange(len(colors)), boundaries=np.arange(len(colors)+1)-0.5) # 设置颜色条刻度和边界 plt.show()

代码详解 2.2.2.2.a:

  • colors = ['lightcoral', 'skyblue', 'lightgreen', 'gold'] 定义了一个包含四个颜色的列表。

  • my_cmap = ListedColormap(colors, name=cmap_name) 使用 ListedColormap 类,基于 colors 列表创建了一个名为 'MyListedColormap' 的自定义色彩映射。

  • plt.imshow(data, cmap=my_cmap, interpolation='nearest') 使用 imshow 显示数据,并指定 cmap=my_cmap 使用自定义色彩映射。interpolation='nearest' 参数确保颜色之间不进行插值,保持离散效果。

  • plt.colorbar(im, ticks=np.arange(len(colors)), boundaries=np.arange(len(colors)+1)-0.5) 设置颜色条的刻度和边界,使其与离散的颜色类别对应。

b. LinearSegmentedColormap

LinearSegmentedColormap 允许你通过定义颜色段来创建连续的色彩映射。你可以指定在数据值范围内,颜色如何线性变化。这对于创建平滑过渡的色彩映射非常有用。

代码实践 2.2.2.2.b:使用 LinearSegmentedColormap 创建自定义色彩映射

import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap import numpy as np # 定义颜色段字典 cdict = { 'red': [(0.0, 0.0, 0.0), (0.5, 1.0, 1.0), (1.0, 1.0, 1.0)], # 红色的变化 'green': [(0.0, 0.0, 0.0), (0.5, 0.0, 1.0), (1.0, 1.0, 1.0)], # 绿色的变化 'blue': [(0.0, 1.0, 1.0), (0.5, 0.0, 0.0), (1.0, 0.0, 0.0)], # 蓝色的变化 'alpha': [(0.0, 1.0, 1.0), (0.5, 1.0, 1.0), (1.0, 1.0, 1.0)] # Alpha 通道保持不透明 (可选) } cmap_name = 'MySegmentedColormap' my_cmap = LinearSegmentedColormap(cmap_name, segmentdata=cdict) # 创建 LinearSegmentedColormap 对象 # 示例数据 (连续数据) data = np.linspace(0, 1, 100).reshape(10, 10) # 生成 0-1 线性变化的数据 plt.figure(figsize=(8, 6)) im = plt.imshow(data, cmap=my_cmap) # 使用自定义色彩映射 plt.title('Custom LinearSegmentedColormap') plt.colorbar(im) plt.show()

代码详解 2.2.2.2.b:

  • cdict 是一个字典,定义了 RGB 和 Alpha 通道在数据值范围 [0, 1] 内的变化。例如,'red': [(0.0, 0.0, 0.0), (0.5, 1.0, 1.0), (1.0, 1.0, 1.0)] 表示:

    • 在数据值 0.0 处,红色分量为 0.0。

    • 在数据值 0.5 处,红色分量变为 1.0。

    • 在数据值 1.0 处,红色分量保持 1.0。

    • 中间的数值会进行线性插值。

  • my_cmap = LinearSegmentedColormap(cmap_name, segmentdata=cdict) 使用 LinearSegmentedColormap 类,基于 cdict 定义的颜色段创建了一个名为 'MySegmentedColormap' 的自定义色彩映射。

  • plt.imshow(data, cmap=my_cmap) 使用 imshow 显示数据,并指定 cmap=my_cmap 使用自定义色彩映射。

Mermaid 图 2.2.2.2:自定义色彩映射的创建

图表解释 2.2.2.2:

  • ListedColormap 创建: 展示了 ListedColormap 的创建过程,通过提供一个颜色列表,生成离散的色彩映射对象。

  • LinearSegmentedColormap 创建: 展示了 LinearSegmentedColormap 的创建过程,通过提供颜色段数据字典 (cdict),生成连续的色彩映射对象。

2.2.3 色彩映射的应用与最佳实践

选择合适的色彩映射方案对于有效的数据可视化至关重要。以下是一些关于色彩映射应用的最佳实践:

  1. 根据数据类型选择色彩映射:

    • 顺序数据: 使用顺序色彩映射,如 'viridis', 'magma', 'Greys' 等,以清晰地表示数据的递增或递减趋势。

    • 发散数据: 使用发散色彩映射,如 'coolwarm', 'RdBu', 'seismic' 等,突出数据相对于中心值的偏差。

    • 类别数据: 使用定性色彩映射,如 'Set1', 'Set2', 'tab10' 等,确保不同类别之间的颜色差异足够明显。

    • 循环数据: 使用循环色彩映射,如 'twilight', 'hsv',避免在循环数据的起点和终点产生视觉上的突变。

  2. 考虑色彩映射的感知均匀性: 理想的色彩映射应该在感知上是均匀的,即在色彩映射中数据值的等间隔变化在视觉上应该呈现出等间隔的颜色变化。'viridis', 'magma', 'inferno', 'plasma' 等较新的色彩映射方案在感知均匀性方面表现较好。

  3. 注意色彩映射的可访问性: 考虑到色盲用户的需求,避免使用红-绿等容易引起混淆的颜色组合。选择色盲友好的色彩映射,例如 'viridis', 'cividis', 'plasma' 等。

  4. 避免过度使用颜色: 在同一个图表中,避免使用过多的颜色,以免造成视觉混乱。选择简洁有效的色彩映射,突出数据的主要特征。

  5. 自定义色彩映射以满足特定需求: 当预定义的色彩映射无法满足需求时,可以考虑使用 ListedColormapLinearSegmentedColormap 创建自定义色彩映射。


发布者: 作者: 转发
评论区 (0)
U