别再手动查颜色代码了!用Python Matplotlib的colormaps和XKCD颜色名,效率提升10倍
每次做数据可视化时,最让我头疼的就是配色问题。记得刚开始用Matplotlib时,我总是一边开着颜色对照表网页,一边在代码里小心翼翼地输入RGB或HEX值,生怕输错一个数字。直到发现了Matplotlib内置的colormaps和XKCD颜色名,才真正从这种低效的工作方式中解脱出来。
如果你也厌倦了在数百种颜色代码中大海捞针,这篇文章将彻底改变你的工作流程。我们将深入探索Matplotlib提供的两大高效配色工具:精心设计的colormaps和由社区命名的XKCD颜色库。通过具体代码示例,你会看到如何用一行代码调用专业级配色方案,以及如何用自然语言般的颜色名称(如"sky blue")替代复杂的RGB值。
1. 告别手动调色:Matplotlib colormaps的强大之处
Matplotlib内置的colormaps是数据可视化领域的隐藏宝藏。这些精心设计的颜色映射不仅能自动生成协调的配色方案,还能根据数据类型(如连续型、离散型、发散型)提供最合适的视觉表达。
1.1 内置colormaps的分类与应用场景
Matplotlib的colormaps主要分为三类:
-
顺序型(Sequential)
:适用于从低到高有序数据,如
viridis,plasma,inferno -
发散型(Diverging)
:适用于有中间值的数据,如
coolwarm,bwr,seismic -
循环型(Cyclic)
:适用于周期性数据,如
twilight,hsv
查看所有可用colormaps的简单方法:
import matplotlib.pyplot as plt
print(plt.colormaps())
1.2 实际应用示例:从基础到高级
基础使用只需在绘图函数中指定cmap参数:
import numpy as np
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
plt.scatter(x, y, c=colors, cmap='viridis')
plt.colorbar()
plt.show()
更专业的做法是创建自定义colormap。比如创建一个从蓝色到红色的渐变:
from matplotlib.colors import LinearSegmentedColormap
colors = ["blue", "white", "red"]
cmap = LinearSegmentedColormap.from_list("mycmap", colors)
plt.imshow(np.random.rand(10,10), cmap=cmap)
plt.colorbar()
提示:使用
plt.colormaps()查看所有可用colormap时,带_r后缀的表示反向版本(如viridis_r)
2. XKCD颜色名:用自然语言替代颜色代码
2010年,XKCD漫画作者Randall Munroe进行了一项大型颜色调查,收集了人们如何命名颜色的数据。Matplotlib将这些命名颜色集成到了库中,形成了包含949种易记颜色名称的XKCD颜色库。
2.1 如何使用XKCD颜色名
使用这些颜色非常简单,只需在颜色名前加上
'xkcd:'
前缀:
plt.plot([1,2,3], color='xkcd:sky blue')
plt.bar([1,2,3], [4,5,6], color='xkcd:grass green')
查看所有XKCD颜色名的完整列表:
import matplotlib._color_data as mcd
print(list(mcd.XKCD_COLORS.keys()))
2.2 与传统方法的对比
传统RGB/HEX方式:
# 天蓝色
plt.plot([1,2,3], color='#87CEEB')
# 或
plt.plot([1,2,3], color=(0.53, 0.81, 0.92))
XKCD方式:
plt.plot([1,2,3], color='xkcd:sky blue')
| 方法 | 代码长度 | 可读性 | 易记性 | 准确性 |
|---|---|---|---|---|
| RGB | 长 | 差 | 差 | 高 |
| HEX | 中 | 中 | 差 | 高 |
| XKCD | 短 | 优 | 优 | 高 |
3. 高级技巧:colormaps与XKCD颜色的组合应用
3.1 从XKCD颜色创建自定义colormap
from matplotlib.colors import LinearSegmentedColormap
colors = ["xkcd:light blue", "xkcd:blue", "xkcd:dark blue"]
cmap = LinearSegmentedColormap.from_list("xkcd_blues", colors)
data = np.random.rand(10,10)
plt.imshow(data, cmap=cmap)
plt.colorbar()
3.2 多系列数据的颜色分配策略
当需要为多个数据系列分配颜色时,可以结合XKCD颜色名和colormap:
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 30, 40]
# 从XKCD中选择一组协调的颜色
colors = ['xkcd:teal', 'xkcd:orange', 'xkcd:red', 'xkcd:purple']
plt.bar(categories, values, color=colors)
4. 专业级可视化配色实战
4.1 科学可视化中的最佳实践
对于科学可视化,颜色选择不仅要美观,更要准确传达数据信息。以下是一些专业建议:
-
避免彩虹色图
:使用
viridis、plasma等现代感知均匀的colormap -
考虑色盲友好
:避免红绿组合,可使用
cividiscolormap -
打印友好
:确保在灰度打印时仍能区分,
viridis是不错的选择
创建色盲友好图的示例:
import matplotlib as mpl
# 模拟色盲视图
with mpl.rc_context({'image.cmap': 'viridis'}):
fig, axs = plt.subplots(1, 2, figsize=(10,4))
im = axs[0].imshow(np.random.rand(10,10))
plt.colorbar(im, ax=axs[0])
axs[0].set_title('Normal')
im = axs[1].imshow(np.random.rand(10,10))
plt.colorbar(im, ax=axs[1])
axs[1].set_title('Deuteranopia')
plt.show()
4.2 交互式颜色选择技巧
在Jupyter notebook中,可以创建交互式颜色选择器:
from IPython.display import display
import ipywidgets as widgets
color_picker = widgets.ColorPicker(concise=False, description='Pick a color')
display(color_picker)
def on_color_change(change):
plt.figure()
plt.plot([1,2,3], color=change['new'])
plt.show()
color_picker.observe(on_color_change, names='value')
对于更专业的颜色选择,可以使用
colorspacious
库进行颜色空间转换和视觉均匀性评估:
import colorspacious as cs
# 比较两种颜色的感知差异
delta = cs.deltaE("xkcd:sky blue", "xkcd:light blue")
print(f"Perceptual difference: {delta}")
1万+

被折叠的 条评论
为什么被折叠?



