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
相关产品推荐
相关产品推荐

