pin_drop当前位置:知识文库 ❯ 图文

Matplotlib颜色与样式完全指南 - 颜色映射、线条样式、内置样式详解

Matplotlib颜色与样式完全指南 - 颜色映射、线条样式、内置样式详解 | 小确幸生活

一、颜色与样式概述

matplotlib提供了丰富的颜色和样式自定义选项,是数据可视化中最基础也是最常用的功能之一。合理的颜色和样式选择可以增强图表的视觉表现力和信息传达效果,让数据更加直观易懂。

matplotlib支持的颜色格式包括:命名颜色(如'red')、十六进制颜色(如'#FF5722')、RGB/RGBA元组等。同时提供强大的颜色映射(colormap)功能,可将连续数值映射为渐变色。

二、颜色格式详解

matplotlib支持多种颜色指定方式,满足不同场景的需求:

颜色格式 示例 说明
命名颜色 'red', 'blue' CSS4命名颜色,共148种
单字符 'r', 'b', 'g' 简写颜色(b/g/r/c/m/y/k/w)
十六进制 '#FF5722' 6位或8位(含透明度)
RGB元组 (0.8, 0.2, 0.1) 每个分量0-1范围
RGBA元组 (0.8, 0.2, 0.1, 0.5) 第四个参数为透明度
灰度 '0.5' 0(黑)到1(白)

以下是颜色格式的实际使用示例:

代码示例

import matplotlib.pyplot as plt
import numpy as np

# 不同颜色格式设置
plt.plot(x, y, color='red')         # 命名颜色
plt.plot(x, y, color='#2196F3')     # 十六进制颜色
plt.plot(x, y, color=(0.3, 0.7, 0.2))  # RGB元组
plt.plot(x, y, color='0.5')         # 灰度值

三、颜色映射(Colormap)

颜色映射(colormap)是matplotlib中非常强大的功能,它将数值自动映射为颜色,特别适合散点图、热力图、等高线图等需要展示数据分布的场景。

常用颜色映射分类

类别 名称示例 特点
顺序映射 viridis, plasma, inferno 从低到高渐变,适合连续数据
发散映射 RdBu, coolwarm, bwr 中间值突出,适合正负偏差数据
定性映射 Set1, Set2, tab10 离散分类颜色,适合分类数据
感知均匀 viridis, cividis 色盲友好,打印效果好

颜色映射的使用配合colorbar()函数可以显示色条,帮助读者理解颜色与数值的对应关系:

代码示例

# 颜色映射应用
plt.scatter(x, y, c=values, cmap='viridis')
plt.colorbar()  # 显示颜色条

小贴士

viridis是matplotlib 2.0之后的默认颜色映射,它是感知均匀的、色盲友好的,并且在黑白打印时也能保持清晰的灰度变化,强烈推荐作为首选颜色映射。

四、线条样式与标记

线条样式用于区分图表中的不同数据系列,matplotlib提供了4种基本线型和多种标记符号。

线型(linestyle)

  • 实线linestyle='-'(默认)

  • 虚线linestyle='--'

  • 点划线linestyle='-.'

  • 点线linestyle=':'

标记符号(marker)

  • 圆形marker='o'

  • 方形marker='s'

  • 三角形marker='^'

  • 星形marker='*'

五、内置样式切换

matplotlib内置了多种全局样式,通过plt.style.use()一键切换图表整体外观:

样式名 特点
'default' 默认样式
'seaborn-v0_8' 统计图表风格
'ggplot' R语言ggplot2风格
'dark_background' 深色背景
'fivethirtyeight' 538网站风格
'bmh' 贝叶斯方法书籍风格

查看系统所有可用样式:

代码示例

import matplotlib.pyplot as plt
print(plt.style.available)  # 列出所有可用样式

六、代码示例实战

示例1:颜色格式与线条样式综合应用

代码示例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)

fig, ax = plt.subplots(figsize=(10, 6))

# 不同颜色格式
ax.plot(x, np.sin(x), color='red', linewidth=2, label='Named: red')
ax.plot(x, np.sin(x) + 0.5, color='#2196F3', linewidth=2, label='Hex: #2196F3')
ax.plot(x, np.sin(x) + 1, color=(0.3, 0.7, 0.2), linewidth=2, label='RGB: (0.3,0.7,0.2)')
ax.plot(x, np.sin(x) + 1.5, color='0.5', linewidth=2, label='Gray: 0.5')

# 不同线型
ax.plot(x, np.cos(x), linestyle='-', linewidth=2, label='Solid')
ax.plot(x, np.cos(x) + 0.5, linestyle='--', linewidth=2, label='Dashed')
ax.plot(x, np.cos(x) + 1, linestyle='-.', linewidth=2, label='DashDot')
ax.plot(x, np.cos(x) + 1.5, linestyle=':', linewidth=2, label='Dotted')

ax.legend(loc='upper right', fontsize=9, ncol=2)
ax.set_title('Color and Line Styles')
ax.grid(True, alpha=0.3)
plt.savefig('color_line_styles.png', dpi=100, bbox_inches='tight')
print("颜色与线型已保存")

输出:

代码示例

颜色与线型已保存

示例2:颜色映射对比

代码示例

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
n = 200
x = np.random.randn(n)
y = np.random.randn(n)
colors = x + y  # 颜色值
sizes = np.random.randint(30, 200, n)

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# viridis颜色映射
sc1 = axes[0].scatter(x, y, c=colors, cmap='viridis', s=sizes, alpha=0.7)
fig.colorbar(sc1, ax=axes[0])
axes[0].set_title('viridis')

# coolwarm颜色映射
sc2 = axes[1].scatter(x, y, c=colors, cmap='coolwarm', s=sizes, alpha=0.7)
fig.colorbar(sc2, ax=axes[1])
axes[1].set_title('coolwarm')

# RdBu颜色映射
sc3 = axes[2].scatter(x, y, c=colors, cmap='RdBu', s=sizes, alpha=0.7)
fig.colorbar(sc3, ax=axes[2])
axes[2].set_title('RdBu')

fig.suptitle('Colormap Comparison', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('colormap_demo.png', dpi=100, bbox_inches='tight')
print("颜色映射已保存")

输出:

代码示例

颜色映射已保存

示例3:内置样式对比

代码示例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)
styles = ['default', 'ggplot', 'dark_background']

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

for ax, style in zip(axes, styles):
    plt.style.use(style)
    ax.plot(x, np.sin(x), linewidth=2)
    ax.plot(x, np.cos(x), linewidth=2)
    ax.set_title(f"Style: {style}")
    ax.grid(True, alpha=0.3)

# 恢复默认样式
plt.style.use('default')
plt.tight_layout()
plt.savefig('style_comparison.png', dpi=100, bbox_inches='tight')
print("样式对比已保存")

输出:

代码示例

样式对比已保存

七、实际应用场景

  • 学术论文:使用viridis等色盲友好颜色映射,确保所有读者都能正确理解图表

  • 演示文稿:使用dark_background样式配合投影仪,深色背景在暗光环境下更清晰

  • 品牌图表:使用企业VI色系的十六进制颜色,保持品牌一致性

八、注意事项

注意:选择颜色映射时应考虑色盲友好性,推荐使用viridis、cividis等感知均匀映射,避免使用rainbow/jet等感知不均匀的颜色映射。

注意plt.style.use()是全局设置,会影响后续所有图表。建议使用with plt.style.context('样式名'):进行临时样式切换。

注意:同一图表中颜色不宜过多,建议不超过7种区分色,否则会造成视觉混乱,降低图表可读性。

九、常见问题FAQ

如何查看所有可用的颜色映射名称?

使用matplotlib.colormaps可以获取所有可用的颜色映射名称。在matplotlib 3.6+版本中,使用list(matplotlib.colormaps)即可查看。

plt.style.use()会影响已经绘制的图表吗?

不会。plt.style.use()只影响调用之后创建的图表,不会改变已经创建或绘制的图表。如果要临时切换样式,建议使用with plt.style.context('样式名'):上下文管理器。

为什么推荐使用viridis而不是rainbow/jet?

rainbow和jet颜色映射在感知上不均匀,会产生虚假的边界和渐变,且对色盲读者不友好。viridis是感知均匀的颜色映射,黑白打印时也能保持清晰的灰度变化,是科学可视化的最佳实践。matplotlib从2.0版本开始已将viridis设为默认颜色映射。

如何自定义颜色映射?

可以使用matplotlib.colors.LinearSegmentedColormap.from_list()从颜色列表创建自定义颜色映射,也可以使用ListedColormap从离散颜色创建。例如:cmap = LinearSegmentedColormap.from_list('custom', ['blue', 'white', 'red'])


标签: matplotlib颜色 颜色映射 线条样式 内置样式 viridis 数据可视化 Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: matplotlib坐标轴设置详解 - Python图表刻度范围对数轴教程 下一篇: Matplotlib annotate注释详解 - 箭头样式、文本框、坐标系定位

poll相关推荐