You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

plt.subplots创建多子图时所有内容重叠显示在同一画布的问题

问题原因

这个问题和Google Colabs平台无关,完全是代码写法错误,核心问题有两个:

  • plt.subplots(2,3)生成的是2行3列的子图布局,返回的axes是形状为(2,3)的二维数组,不是长度为6的一维数组,直接用axes[0]到axes[5]做单索引,拿到的是整行的坐标轴集合,不是单个子图的坐标轴对象。
  • 你调用的plt.plot()是matplotlib的全局绘图接口,默认只会在当前激活的单个坐标轴(也就是该布局下最后创建的右下角子图)上绘制内容,不会自动分配到不同子图;同时你将plt.plot()的返回值(Line2D图形对象列表,不是坐标轴对象)赋值给axes的元素,直接覆盖了原本生成的子图坐标轴对象,彻底破坏了子图结构。
正确写法

方法1:展平坐标轴数组后按顺序索引

适合需要按顺序给子图绘图、或者配合循环批量绘图的场景:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2,3,figsize=(15,10))
# 将2*3的二维坐标轴数组展平为长度为6的一维数组,支持0-5的单索引
flat_axes = axes.flatten()

# 调用单个子图坐标轴的plot方法绘图,不要用全局plt.plot()
flat_axes[0].plot([1, 2, 3, 4])
flat_axes[1].plot([2, 2, 3, 4])
flat_axes[2].plot([3, 2, 3, 4])
flat_axes[3].plot([4, 2, 3, 4])
flat_axes[4].plot([5, 2, 3, 4])
flat_axes[5].plot([6, 2, 3, 4])

# 自动调整子图间距,避免标签、标题重叠
plt.tight_layout()
plt.show()

方法2:使用二维坐标索引子图

不需要修改axes结构,直接通过[行索引, 列索引]定位单个子图即可:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2,3,figsize=(15,10))
# 第一行子图(行索引为0)
axes[0,0].plot([1, 2, 3, 4])
axes[0,1].plot([2, 2, 3, 4])
axes[0,2].plot([3, 2, 3, 4])
# 第二行子图(行索引为1)
axes[1,0].plot([4, 2, 3, 4])
axes[1,1].plot([5, 2, 3, 4])
axes[1,2].plot([6, 2, 3, 4])

plt.tight_layout()
plt.show()
注意事项
  • 多子图场景下,优先使用单个子图Axes对象的绘图方法(比如ax.plot()、sns.barplot(ax=目标坐标轴)),尽量不要直接调用plt.plot()这类全局接口,全局接口只会操作当前激活的单个坐标轴,不会自动分发内容到不同子图。
  • 不要随意给plt.subplots()返回的axes数组元素赋值,否则会覆盖原生的子图坐标轴对象,导致后续无法操作对应子图。
  • 如果子图布局是单行或者单列(比如plt.subplots(1,3)或者plt.subplots(3,1)),返回的axes才是一维数组,可以直接用0开始的单索引定位单个子图。

内容的提问来源于stack exchange,提问作者Andykjb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:33:21