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

Matplotlib for循环批量绘图出现多余空白子图的解决方法

JupyterLab 绘制多组随机游走轨迹时多余空白子图的去除方法

问题描述

  • 开发场景:在JupyterLab Notebook中实现随机游走模拟器,通过for循环生成10组随机游走数据集,将所有轨迹绘制在同一张画布上
  • 异常表现:代码运行后,除目标绘图结果外,额外出现了无内容的空白子图

复现代码

# 随机游走模拟器实现
import matplotlib.pyplot as plt
import numpy as np
def random_walk(random_state_index, initial_position=(0, 0), steps=1000):
    np.random.RandomState(random_state_index)
    X, Y = [initial_position[0]], [initial_position[0]]
    for i in range(steps):
        plt.pause(0.00001)
        # 随机选择步长方向
        ways = ["up", "down", "left", "right"]
        direction = np.random.choice(ways, p = [0.3,0.2,0.25,0.25])
        if direction == "up":
            X.append(X[-1])
            Y.append(Y[-1] + 0.1)
        if direction == "down":
            X.append(X[-1])
            Y.append(Y[-1] - 0.1)
        if direction == "left":
            X.append(X[-1] - 0.1)
            Y.append(Y[-1])
        if direction == "right":
            X.append(X[-1] + 0.1)
            Y.append(Y[-1])
    return X,Y

# 绘图逻辑
fig, ax = plt.subplots()
for i in range(10):
    X,Y = random_walk(random_state_index = i)
    ax.plot(X,Y)
fig

运行上述代码后,输出结果包含绘制了10条游走轨迹的目标画布,同时附带多个无绘图内容的空白子图,和预期输出不符。

根因分析

异常来自随机游走函数中调用的plt.pause(0.00001):该方法是Matplotlib交互模式下的帧刷新接口,调用时如果当前没有活动的画布对象,会自动创建新的空白画布。在JupyterLab的默认渲染逻辑下,这些自动创建的空白画布会和手动创建的目标画布一同被输出,最终形成多余的空白子图。

解决方法

不需要启用交互模式,首先指定Matplotlib使用inline后端,通过plt.show(block=True)阻塞自动创建画布的渲染逻辑,再执行绘图流程即可。修正后的代码如下:

%matplotlib inline
plt.show(block = True)
fig, ax = plt.subplots()
for i in range(10):
    X,Y = random_walk(random_state_index = i)
    ax.plot(X,Y)

运行修正后的代码,将仅输出包含全部随机游走轨迹的单张画布,不会再产生多余的空白子图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:34:46