Matplotlib:Jupyter Notebook与.py脚本保存的图表为何不一致?
解决Jupyter Notebook与.py脚本柱状图不一致的问题
核心问题分析
你的函数里存在几个关键问题,导致两种环境下图表表现不同:
- 画布尺寸设置时机错误:创建柱状图后才修改
figure.figsize,此时画布已默认生成,尺寸设置不会生效。 - 绘图状态残留:Jupyter Notebook每次单元格运行都会自动创建新绘图上下文,而.py脚本中若多次调用函数,会复用旧画布状态,导致图表样式混乱或叠加。
- 保存图片时未处理布局:默认保存可能裁剪坐标轴标签、标题,和Notebook显示效果脱节。
修复后的函数代码
import matplotlib.pyplot as plt def dict_bar_plot(data, width_inch=20, height_inch=10, title="", save_fig=False, save_name="default", show_fig=False): # 提前创建指定尺寸的画布和轴,避免状态残留 fig, ax = plt.subplots(figsize=(width_inch, height_inch)) names = list(data.keys()) values = list(data.values()) bar_container = ax.bar(range(len(data)), values, tick_label=names, color="#F9D1E4") ax.set_xticklabels(names, rotation=90) labels = [val if val > 0 else "" for val in bar_container.datavalues] ax.bar_label(bar_container, labels=labels) ax.set_title(title) if save_fig: # 自动调整布局,避免标签、标题被裁剪 plt.tight_layout() plt.savefig(f"{PLOTS_PATH}/{save_name}.png") if show_fig: plt.show() # 关闭画布释放资源,防止后续绘图复用旧状态 plt.close(fig)
关键修改说明
- 提前设置画布尺寸:通过
plt.subplots(figsize=(...))在绘图前就定义好画布大小,确保尺寸生效。 - 使用面向对象绘图:用
ax对象调用绘图方法(如ax.bar、ax.set_title),替代全局plt调用,避免全局状态干扰。 - 添加布局调整:
plt.tight_layout()自动适配元素位置,保证保存的图片和Notebook显示的布局一致。 - 关闭画布:
plt.close(fig)清理当前绘图状态,避免.py脚本多次调用函数时出现异常。 - 修正参数拼写:原函数中
widh_inch、heigh_inch改为正确的width_inch、height_inch,避免参数传递错误。
额外检查项
- 确认Matplotlib版本一致:在终端和Notebook中分别运行
pip show matplotlib,版本差异可能导致渲染效果不同。 - 验证
PLOTS_PATH变量:确保.py脚本中已正确定义该路径,路径不存在会导致保存失败,可能误判图表生成异常。
内容的提问来源于stack exchange,提问作者Jeremy Duval
相关产品推荐
相关产品推荐

