Python中用for循环绘制多子图出现挤压问题求助
解决Matplotlib子图挤压重叠问题
你的问题核心是子图高度分配不足,17个子图挤在仅10单位高度的画布上,导致所有图表重叠挤压。另外代码里还有个小问题:set_title(key)中的key未定义,应该替换为当前循环的contract。
修复后的代码:
import matplotlib.pyplot as plt # 根据子图数量调整画布高度,给每个子图足够垂直空间 fig, ax = plt.subplots(nrows=len(Opts_Data_All), figsize=(20, 6*len(Opts_Data_All))) for index, contract in enumerate(Opts_Data_All): ax[index].set_xlabel('行权价') ax[index].set_ylabel('隐含波动率') ax[index].set_title(f'合约:{contract}') # 若数据包含Strike列,建议将x轴设为行权价,图表更具可读性 ax[index].plot(Opts_Data_All[contract]['Strike'], Opts_Data_All[contract]['IV']) # 自动调整子图间距,避免标签、标题重叠 plt.tight_layout() plt.show()
关键调整点:
- 画布高度适配:将
figsize的高度设为6*len(Opts_Data_All),每个子图分配6单位高度,17个子图总高度为102,足够清晰展示内容。 - 修复标题变量:用
contract替代未定义的key,让每个子图标题对应当前合约名称。 - 添加tight_layout:自动优化子图间距和标签位置,避免文字重叠。
- 优化x轴数据:如果数据中包含
Strike(行权价)列,将其设为x轴,比默认索引更有业务意义。
若需要更灵活的间距控制,可替换tight_layout为手动调整:
plt.subplots_adjust(hspace=0.5) # 调整子图垂直间距,0.5为相对值,可按需修改
内容的提问来源于stack exchange,提问作者Rahan
相关产品推荐
相关产品推荐

