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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:07