← 返回Book 2目录
第04章

装饰

Visual Decoration · 图表装饰与美化

掌握Matplotlib图脊、网格、轴、标注和三维视角控制

📐 章节概览

本章深入探讨Matplotlib图表的装饰与美化技巧,包括图脊(spines)的显示与位置控制、 网格(grid)的样式设定、坐标轴(axis)的刻度与标签格式化、对数坐标系的应用、 标题与图例的布局,以及三维图形的视角调整。这些技能是创建专业级科学可视化的基础。

🖼️
图脊与网格
控制边框和背景网格
📊
轴与坐标系
刻度、标签和对数坐标
🔮
标注与视角
标题、图例和3D视角
4.1

修改图脊

Spines Customization · 控制图表边框的显示与样式

图脊(Spines)是图表的四条边框线(top、right、bottom、left)。 通过控制图脊的可见性、位置、颜色和样式,可以创建简洁的科学图表, 例如将底部和左侧图脊移至坐标原点,形成笛卡尔坐标系。

4.1 图脊自定义器

实时调整图脊(spines)的可见性、位置、颜色和样式

图脊可见性

图脊位置

线条样式

图脊颜色

💡 关键概念

  • • 图脊(Spines):图表边框的四条线
  • • 位置设定:可将坐标轴移至中心形成笛卡尔坐标系
  • • 可见性控制:ax.spines['top'].set_visible(False)
  • • 位置控制:set_position(('data', 0)) 移至数据坐标0处
4.2

修改网格

Grid Customization · 调整背景网格的样式和层级

网格(Grid)分为主网格(major grid)和次网格(minor grid)。 主网格对应主刻度线,次网格对应次刻度线。通过set_axisbelow(True)可将网格置于曲线下方,避免遮挡数据。还可以自定义网格颜色、线型和背景色。

4.2 网格自定义器

控制网格的显示、样式和层级关系

网格显示

主网格样式

次网格样式

背景颜色

💡 关键概念

  • • 主网格:对应主刻度线,ax.grid(which='major')
  • • 次网格:对应次刻度线,ax.grid(which='minor')
  • • 层级关系:ax.set_axisbelow(True) 将网格置于曲线下方
  • • 背景色:ax.set_facecolor('#DBEEF8')
4.3

修改图轴

Axis Customization · 刻度、标签和格式化器

坐标轴(Axis)包括刻度线(ticks)和刻度标签(tick labels)。 可以控制刻度的位置(bottom/top/both)、方向(in/out/inout)、长度和颜色。 使用格式化器(Formatter)可以自定义标签格式,例如显示为π的倍数、保留小数位数等。

4.3 图轴自定义器

自定义刻度、标签、方向和格式

-15.0-10.0-5.00.05.010.015.0-1.0-0.50.00.51.0

轴显示

刻度位置

刻度方向

刻度长度

标签旋转

标签格式

💡 关键概念

  • • 刻度位置:ax.tick_params(bottom=True, top=False)
  • • 刻度方向:direction='in' | 'out' | 'inout'
  • • 标签旋转:ax.tick_params(axis='x', rotation=45)
  • • 格式化器:ax.xaxis.set_major_formatter(FormatStrFormatter('%.2f'))
4.4

对数坐标

Logarithmic Scale · 处理跨度大的数据

对数坐标系将数值以对数尺度显示,适合展示跨越多个数量级的数据(如0.001到1000)。 可以设置单轴对数(半对数图)或双轴对数(双对数图)。指数函数在半对数图中显示为直线, 幂函数在双对数图中显示为直线。

4.4 对数坐标探索器

对比线性和对数坐标系下的函数行为

f(x) = 10ˣ
f(x) = x
f(x) = log₁₀(x)
02468100246810LinearLinear

X轴坐标系

Y轴坐标系

常用组合

🔍 观察要点

  • • 指数函数在对数-线性坐标系中变为直线
  • • 幂函数在对数-对数坐标系中变为直线
  • • 对数函数在线性-对数坐标系中变为直线
  • • 对数坐标压缩大数值范围,便于观察跨度大的数据

💡 关键概念

  • • 对数坐标:ax.set_xscale('log'), ax.set_yscale('log')
  • • 用途:显示跨越多个数量级的数据(如0.001到1000)
  • • 网格:对数坐标的网格间距不均匀,反映数量级变化
  • • 半对数图:一轴对数一轴线性,用于指数增长数据
4.5

标注

Annotations · 标题、轴标签和图例

标注(Annotations)包括标题(title)、轴标签(xlabel/ylabel)和图例(legend)。 可以控制标题的对齐方式(left/center/right)、支持多行标题、设置轴标签的位置, 以及调整图例的位置(upper right/best等)。这些元素让图表更具可读性和专业性。

4.5 标注演示

自定义轴标签、标题和图例的位置

This is the TitleX Axis LabelY Axis LabelFunction AFunction B

显示元素

标题设置

X轴标签

Y轴标签

图例位置

💡 关键概念

  • • 轴标签:ax.set_xlabel('X Axis', loc='left'/'center'/'right')
  • • 标题:ax.set_title('Title', loc='left'/'center'/'right')
  • • 标签位置:ax.xaxis.set_label_position('top')
  • • 图例:plt.legend(loc='upper right'/'best')
4.6

三维视角

3D View Angles · Elevation和Azimuth

三维视角通过view_init(elev, azim)控制。Elevation(仰角)控制垂直视角(-90°到90°),0°为水平视角,90°为俯视。Azimuth(方位角)控制水平旋转角度(0°到360°)。 原文展示了13×13=169个视角组合,帮助理解三维曲面的完整形状。

4.6 三维视角探索器

调整elevation和azimuth角度观察三维曲面

XYZElevation: 30°Azimuth: 45°

Elevation(仰角)

30°
-90°(底视)0°(水平)90°(俯视)

控制观察者相对于XY平面的垂直角度

Azimuth(方位角)

45°
0°180°360°

控制观察者围绕Z轴的旋转角度

快速调整

📐 视角说明

  • • Elevation:垂直视角(-90°到90°)
  • • Azimuth:水平旋转角度(0°到360°)
  • • 等轴测:elev=35.264°, azim=45°
  • • 试试自动旋转观察曲面的完整形状!

💡 关键概念

  • • view_init():ax.view_init(elev=30, azim=45)
  • • 投影类型:ax.set_proj_type('ortho') 正交投影
  • • 视角矩阵:Matplotlib使用旋转矩阵计算3D到2D投影
  • • 原文对应:展示了13×13=169个视角组合(图4-6)

📚章节总结

核心技能

  • ✓ 图脊的显示/隐藏和位置控制
  • ✓ 网格的主次分级和层级管理
  • ✓ 刻度和标签的格式化
  • ✓ 对数坐标系的应用场景
  • ✓ 标题、标签和图例的布局
  • ✓ 三维图形的视角调整

关键函数

  • • ax.spines['top'].set_visible(False)
  • • ax.grid(which='major', linestyle='-')
  • • ax.tick_params(direction='in')
  • • ax.set_xscale('log')
  • • ax.set_xlabel('X', loc='left')
  • • ax.view_init(elev=30, azim=45)

💡 学习建议:装饰是让图表从"能看"变为"好看"的关键步骤。 建议先掌握基础的图脊和网格控制,再深入学习刻度格式化和对数坐标。 三维视角需要多次实验才能找到最佳角度,可以使用原文提供的视角矩阵作为参考。

💻Python代码参考

本章内容对应以下Jupyter Notebook代码文件:

Bk_2_Ch04_01.ipynb修改图脊(18个示例)
Bk_2_Ch04_02.ipynb修改网格(6个示例)
Bk_2_Ch04_03.ipynb修改图轴(18个示例)
Bk_2_Ch04_04.ipynb对数坐标(4种组合)
Bk_2_Ch04_05.ipynb标注(6个示例)
Bk_2_Ch04_06.ipynb三维视角(169个视角矩阵)
📁 代码位置:books/Book2_Beauty-of-Data-Visualization/Book2_Ch04_Python_Codes/