子图与布局
组合多个图表
子图与布局 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
为什么需要多个图表
一个图表通常并不足够。您可能希望并排比较多个视图,或将信息密集的图表拆分成较小的面板。Matplotlib 将这种做法称为在一个图形中排列多个坐标区。
主要工具是 plt.subplots(rows, cols)。
坐标区网格
fig, axes = plt.subplots(2, 3) 会创建一个 2 行 3 列的图形网格,共有六个坐标区。axes 结果是一个二维数组,可以像 axes[0][1] 一样进行索引。
面板总数就是行数乘以列数。
rows, cols = 2, 3
total = rows * cols
print('Grid', rows, 'x', cols, '=', total, 'axes')
for r in range(rows):
for c in range(cols):
print('panel at', (r, c))为坐标区数组建立索引
只有一行时,axes 是一维的:请使用 axes[0]、axes[1]。使用完整网格时,它是二维的:axes[row][col]。
只有一个子图时,完全不需要建立索引。
遍历面板
一种简洁的写法是先将网格展平,然后循环遍历,并将每个坐标区与其数据配对。这样可以避免为每个面板重复编写几乎相同的代码。
datasets = ['A', 'B', 'C', 'D']
# imagine axes flattened to a list of 4
for i, name in enumerate(datasets):
print('Plot dataset', name, 'on flat axes index', i)共享坐标区
当多个面板共享同一个刻度范围时,请传入 sharex=True 或 sharey=True。这样,子图会使用同一个公共范围,使比较更加公平,并去除多余的刻度标签。
这非常适合堆叠的时间序列。
网格图形的大小
网格比单个图表需要更多空间。调用子图函数时,请使用以英寸为单位的 figsize=(width, height) 设置大小。一个经验法则是根据列数和行数调整尺寸。
cols, rows = 3, 2
per_panel_w, per_panel_h = 3, 2.5
print('Suggested figsize:', (cols * per_panel_w, rows * per_panel_h))面板之间的间距
面板可能会彼此挤在一起。fig.tight_layout() 可以自动解决大多数情况。如需更精细的控制,请使用 fig.subplots_adjust(wspace=0.4, hspace=0.4) 设置水平和垂直间距。
数值越大,子图之间的空间就越大。
使用 GridSpec 创建不规则布局
并非所有布局都是规则网格。GridSpec 可以让一个坐标区跨越多行或多列,例如在顶部放置一个宽图,在底部放置两个小图。
您可以先定义网格,然后像对数组进行切片一样放置每个坐标区。
规划跨越范围
请将 GridSpec 切片想象成范围。跨越所有列的顶部图表是 gs[0, :];左下方图表是 gs[1, 0]。先在纸上规划切片,可以避免混淆。
layout = {
'header': '[0, :] (full width)',
'left': '[1, 0] (bottom left)',
'right': '[1, 1] (bottom right)',
}
for name, slot in layout.items():
print(name.ljust(7), slot)一图一故事
多面板图形仍然应该讲述一个连贯的故事。请使用共享的 fig.suptitle()、一致的颜色和共享的刻度范围,让各个面板作为一个整体呈现,而不是像随意拼贴的图片。
按面板自定义
由于每个单元格都是独立的坐标区,您可以分别自定义它们。axes[0][0].set_title('Sales') 只会为左上方面板设置标题,而 axes[1][1].set_ylabel('Cost') 只会为右下方面板添加标签。
正是这种独立性,让面向对象风格在网格布局中展现出优势。
快速检查
检验您对多面板布局的掌握程度。
回顾
现在您可以组合多个图表:
plt.subplots(rows, cols)创建坐标区网格- 使用
axes[row][col]建立索引,或将网格展平后循环遍历 sharex/sharey对齐刻度范围;figsize设置网格大小tight_layout和subplots_adjust管理间距GridSpec支持跨越多个单元格的面板
常见问题解答
「子图与布局」课时是免费的吗?
是的 — 「子图与布局」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「子图与布局」这节课中我会学到什么?
组合多个图表 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「子图与布局」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。