📐 章节概览
本章深入探讨Matplotlib图表的装饰与美化技巧,包括图脊(spines)的显示与位置控制、 网格(grid)的样式设定、坐标轴(axis)的刻度与标签格式化、对数坐标系的应用、 标题与图例的布局,以及三维图形的视角调整。这些技能是创建专业级科学可视化的基础。
修改图脊
Spines Customization · 控制图表边框的显示与样式
图脊(Spines)是图表的四条边框线(top、right、bottom、left)。 通过控制图脊的可见性、位置、颜色和样式,可以创建简洁的科学图表, 例如将底部和左侧图脊移至坐标原点,形成笛卡尔坐标系。
4.1 图脊自定义器
实时调整图脊(spines)的可见性、位置、颜色和样式
图脊可见性
图脊位置
线条样式
图脊颜色
💡 关键概念
- • 图脊(Spines):图表边框的四条线
- • 位置设定:可将坐标轴移至中心形成笛卡尔坐标系
- • 可见性控制:ax.spines['top'].set_visible(False)
- • 位置控制:set_position(('data', 0)) 移至数据坐标0处
修改网格
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')
修改图轴
Axis Customization · 刻度、标签和格式化器
坐标轴(Axis)包括刻度线(ticks)和刻度标签(tick labels)。 可以控制刻度的位置(bottom/top/both)、方向(in/out/inout)、长度和颜色。 使用格式化器(Formatter)可以自定义标签格式,例如显示为π的倍数、保留小数位数等。
4.3 图轴自定义器
自定义刻度、标签、方向和格式
轴显示
刻度位置
刻度方向
刻度长度
标签旋转
标签格式
💡 关键概念
- • 刻度位置: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'))
对数坐标
Logarithmic Scale · 处理跨度大的数据
对数坐标系将数值以对数尺度显示,适合展示跨越多个数量级的数据(如0.001到1000)。 可以设置单轴对数(半对数图)或双轴对数(双对数图)。指数函数在半对数图中显示为直线, 幂函数在双对数图中显示为直线。
4.4 对数坐标探索器
对比线性和对数坐标系下的函数行为
X轴坐标系
Y轴坐标系
常用组合
🔍 观察要点
- • 指数函数在对数-线性坐标系中变为直线
- • 幂函数在对数-对数坐标系中变为直线
- • 对数函数在线性-对数坐标系中变为直线
- • 对数坐标压缩大数值范围,便于观察跨度大的数据
💡 关键概念
- • 对数坐标:ax.set_xscale('log'), ax.set_yscale('log')
- • 用途:显示跨越多个数量级的数据(如0.001到1000)
- • 网格:对数坐标的网格间距不均匀,反映数量级变化
- • 半对数图:一轴对数一轴线性,用于指数增长数据
标注
Annotations · 标题、轴标签和图例
标注(Annotations)包括标题(title)、轴标签(xlabel/ylabel)和图例(legend)。 可以控制标题的对齐方式(left/center/right)、支持多行标题、设置轴标签的位置, 以及调整图例的位置(upper right/best等)。这些元素让图表更具可读性和专业性。
4.5 标注演示
自定义轴标签、标题和图例的位置
显示元素
标题设置
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')
三维视角
3D View Angles · Elevation和Azimuth
三维视角通过view_init(elev, azim)控制。Elevation(仰角)控制垂直视角(-90°到90°),0°为水平视角,90°为俯视。Azimuth(方位角)控制水平旋转角度(0°到360°)。 原文展示了13×13=169个视角组合,帮助理解三维曲面的完整形状。
4.6 三维视角探索器
调整elevation和azimuth角度观察三维曲面
Elevation(仰角)
30°控制观察者相对于XY平面的垂直角度
Azimuth(方位角)
45°控制观察者围绕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/