如何解决matplotlib animation导出动画时出现多余内边距的问题
解决方法
根因
matplotlib的交互显示逻辑和文件保存逻辑使用两套独立的默认渲染参数,动画导出时调用的savefig默认会额外添加内边距,所以会出现plt.show()显示正常,但导出视频边距异常的问题。
修复代码
import matplotlib.pyplot as plt import matplotlib.animation as animation class Animation(animation.TimedAnimation): def __init__(self): # 固定画布尺寸、dpi,避免渲染参数不一致,数值可根据需求调整 fig = plt.figure(figsize=(6, 4), dpi=100) fig.add_subplot(2, 2, 1) fig.add_subplot(2, 2, 2) fig.add_subplot(3, 2, (3, 4)) # 自动匹配子图边距,pad参数可调整全局边距大小 fig.tight_layout(pad=1.0) animation.TimedAnimation.__init__(self, fig, blit=True) def _draw_frame(self, frame_idx): pass def new_frame_seq(self): return iter(range(2)) ani = Animation() # 保存时透传savefig参数,关闭自动裁剪,对齐显示效果 ani.save( 'test.mp4', savefig_kwargs={ "bbox_inches": None, "pad_inches": 0 } )
可选:手动精确控制边距
如果需要自定义边距、不需要自动布局,将fig.tight_layout(pad=1.0)替换为下面的代码即可,参数取值为0-1(相对于画布宽高的比例),无需设置负值,不会改变绘图比例:
fig.subplots_adjust(left=0.1, right=0.95, top=0.92, bottom=0.08)
修改后导出的视频边距会和直接绘图、plt.show()的效果完全一致。
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

