杰瑞科技汇

Python colormap参数如何选择?

  1. 什么是 Colormap?
  2. 如何使用 Colormap?(Matplotlib 示例)
  3. Colormap 的分类与选择
  4. 如何创建和修改 Colormap?
  5. 常用 Colormap 及其应用场景
  6. 在不同库中的使用

什么是 Colormap?

想象一下,你有一组从 0 到 100 的数字,如果直接显示它们,你可能只会看到一堆数字,很难看出它们之间的模式和差异。colormap 就像一个“颜色翻译器”,它为这组数字中的每一个值分配一个特定的颜色。

Python colormap参数如何选择?-图1
(图片来源网络,侵删)

这个过程通常是这样的: 数据值 -> 归一化到 [0, 1] -> 映射到 Colormap 的颜色条上 -> 生成最终颜色

'viridis' 这个 colormap 中,数值 0 可能对应深紫色,0.5 对应亮绿色,而 1 对应亮黄色。


如何使用 Colormap?(以 Matplotlib 为例)

在 Python 的数据可视化库中,Matplotlib 是最基础也是最广泛使用的一个,它对 colormap 的支持非常完善,我们主要以 Matplotlib 为例进行说明。

基本用法:imshowpcolormesh

这两个函数常用于显示二维数据矩阵(如热力图)。cmap 参数直接指定要使用的 colormap 名称。

Python colormap参数如何选择?-图2
(图片来源网络,侵删)
import numpy as np
import matplotlib.pyplot as plt
# 创建一些示例数据
data = np.random.rand(10, 10)
# --- 使用不同的 colormap ---
# 1. 'viridis' (默认之一,色盲友好)
plt.figure(figsize=(12, 3))
plt.subplot(1, 4, 1)
plt.imshow(data, cmap='viridis')'viridis')
# 2. 'plasma'
plt.subplot(1, 4, 2)
plt.imshow(data, cmap='plasma')'plasma')
# 3. 'inferno'
plt.subplot(1, 4, 3)
plt.imshow(data, cmap='inferno')'inferno')
# 4. 'magma'
plt.subplot(1, 4, 4)
plt.imshow(data, cmap='magma')'magma')
plt.tight_layout()
plt.show()

在散点图中使用 c 参数和 cmap

在散点图中,c 参数用于指定每个点的数值,cmap 参数则用于根据这些数值来决定点的颜色。

import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.random.rand(50)
y = np.random.rand(50)
# 这是决定颜色的数值
colors = np.random.rand(50) 
plt.scatter(x, y, c=colors, cmap='coolwarm')
plt.colorbar() # 显示颜色条'Scatter Plot with Colormap')
plt.show()

这里,c=colors 告诉 Matplotlib 用 colors 数组中的值来着色,而 cmap='coolwarm' 定义了从蓝色(低值)到红色(高值)的渐变。

在 3D 曲面图中使用

plot_surface 中,cmap 参数同样可以用来根据曲面的高度(Z值)进行着色。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 创建数据
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# 使用 cmap 进行着色
surf = ax.plot_surface(X, Y, Z, cmap='jet', linewidth=0, antialiased=False)
fig.colorbar(surf, shrink=0.5, aspect=5) # 添加颜色条'3D Surface with Colormap')
plt.show()

Colormap 的分类与选择

选择合适的 colormap 至关重要,错误的 colormap 可能会误导观众,Matplotlib 中的 colormap 主要分为三大类:

Python colormap参数如何选择?-图3
(图片来源网络,侵删)

a) 顺序型

这类 colormap 的颜色变化是单一、连续的,通常从浅到深或从一种颜色渐变到另一种颜色,它们非常适合表示有序的、连续的数据,如温度、高度、人口密度等。

  • 特点: 没有明显的中间值,视觉上是单调的。
  • 常用: 'viridis', 'plasma', 'inferno', 'magma', 'cividis', 'Greys', 'Blues'

强烈推荐: 'viridis''plasma',它们是现代科学可视化的默认选择,因为它们不仅美观,更重要的是对色盲友好,并且在打印为黑白图像时也能保持较好的可区分度。

b) 发散型

这类 colormap 通常从一种颜色(如白色、浅灰色)开始,向两个方向(通常是两种对比色,如蓝-红)渐变,它们非常适合表示有中性基准点或需要强调偏离中心的数据,如温度异常(相对于平均温度)、误差、相关性等。

  • 特点: 中心有一个明显的断点或中性色。
  • 常用: 'RdBu' (红-蓝), 'coolwarm', 'seismic', 'PiYG'

警告: 避免使用 'jet'(彩虹色)!它是一个经典的发散型 colormap,但存在严重缺陷:在视觉上不均匀(绿色区域比红蓝区域更“突出”),并且容易产生虚假的等高线效果,误导数据解读。

c) 循环/定性型

这类 colormap 的颜色是循环的或没有特定顺序,它们不适合表示有序数据,但可以用来表示没有内在顺序的类别数据

  • 循环型: 颜色从一端开始,经过一系列变化后,平滑地回到起始颜色,适合表示角度、周期性数据等。
    • 常用: 'twilight', 'hsv'
  • 定性型: 一系列互不相关的、高饱和度的颜色,用于区分不同的类别。
    • 常用: 'tab10', 'tab20', 'Set1', 'Pastel1'

如何创建和修改 Colormap?

除了使用内置的 colormap,你还可以创建自己的。

从列表创建自定义 Colormap

你可以提供一个颜色列表(可以是颜色名称或十六进制代码)来创建一个 LinearSegmentedColormap。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
# 定义自定义颜色列表
colors = ["darkblue", "blue", "lightblue", "white", "pink", "red", "darkred"]
n_bins = 100 # 将颜色分成多少段
# 创建自定义 colormap
cmap_name = 'ocean_to_lava'
custom_cmap = LinearSegmentedColormap.from_list(cmap_name, colors, N=n_bins)
# 测试自定义 colormap
data = np.linspace(0, 1, 256).reshape(1, -1)
plt.figure(figsize=(6, 1))
plt.imshow(data, aspect='auto', cmap=custom_cmap)f"Custom Colormap: '{cmap_name}'")
plt.axis('off')
plt.show()

反转 Colormap

只需要在 colormap 名称后加一个 _r 即可。

import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
# 原始 colormap
im1 = ax1.imshow(data, cmap='viridis')
ax1.set_title('viridis')
fig.colorbar(im1, ax=ax1)
# 反转 colormap
im2 = ax2.imshow(data, cmap='viridis_r')
ax2.set_title('viridis (reversed)')
fig.colorbar(im2, ax=ax2)
plt.show()

常用 Colormap 及其应用场景

Colormap 名称 类型 主要应用场景 备注
viridis 顺序型 默认首选,任何连续数据,如高度、温度、密度。 色盲友好,打印友好。
plasma 顺序型 类似 viridis,但颜色更“热”,适合强调高值。 色盲友好。
inferno / magma 顺序型 黑暗背景下使用,颜色对比度高。 色盲友好。
cividis 顺序型 专门为色盲人士黑白打印优化。 强烈推荐用于需要广泛传播的图表。
Greys 顺序型 简单的灰度图,或用于学术论文。 经典、简洁。
coolwarm 发散型 强调相对于零或均值的偏差。 jet 好得多,是 jet 的安全替代品。
RdBu (Red-Blue) 发散型 类似 coolwarm,对比度更强。 注意红色和蓝色在色盲人群中可能难以区分。
seismic 发散型 另一个流行的发散型选择。 中间是白色,对比明显。
jet 发散型 强烈不推荐 视觉不均,容易产生误导。
tab10 / tab20 定性型 区分少量(10/20个)无序的类别。 Matplotlib 默认的类别色板,颜色区分度高。
hsv 循环型 表示角度、周期性数据,或创造艺术效果。 色相循环,亮度和饱和度不变。

在不同库中的使用

虽然 Matplotlib 是基础,但其他高级库也沿用了或兼容了 Matplotlib 的 colormap 系统。

Seaborn

Seaborn 是一个基于 Matplotlib 的高级可视化库,它有自己的默认 colormap,但也可以无缝使用 Matplotlib 的所有 colormap。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 使用 Seaborn 的 heatmap
data = np.random.randn(10, 10)
# cmap 参数直接传入 Matplotlib 的 colormap 名称
ax = sns.heatmap(data, cmap='viridis', center=0)'Seaborn Heatmap with Matplotlib cmap')
plt.show()

Plotly

Plotly 是一个交互式可视化库,它同样支持 Matplotlib 的 colormap。

import plotly.express as px
import numpy as np
# 使用 Plotly Express
df = px.data.iris()
# color_continuous_scale 参数对应 cmap
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="petal_length",
                 color_continuous_scale='viridis') # 使用 'viridis'
fig.show()
  1. colormap (或 cmap) 是将数据值映射为颜色的关键参数。
  2. 在 Matplotlib 中,它广泛用于 imshow, scatter, plot_surface 等函数。
  3. 选择时务必考虑数据类型
    • 连续数据 -> 顺序型 (viridis, plasma)。
    • 有基准点的数据 -> 发散型 (coolwarm, RdBu)。
    • 无序类别数据 -> 定性型 (tab10)。
  4. 避免使用 jet,优先选择对色盲友好的 viridis, plasma, cividis
  5. 你可以通过 from_list 创建自己的 colormap,或通过 _r 后缀轻松反转现有的 colormap。
分享:
扫描分享到社交APP
上一篇
下一篇