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

