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

Jupyter中Seaborn绘图与装饰器打印顺序异常问题解决

解决Jupyter中装饰器输出早于Seaborn绘图显示的问题

我来帮你搞定这个问题!你遇到的情况是因为Jupyter Notebook对matplotlib/Seaborn图形的渲染机制:函数里创建的绘图对象会在函数执行完成后才被Notebook自动渲染显示,而你的@timer装饰器是在函数执行完毕后立即打印运行时长和感谢语,这就导致文字输出先出现,图形后显示。

下面给你两种简单的解决思路:

方法1:在函数内显式触发图形显示

直接在Klasse3函数的绘图代码之后加上plt.show(),强制图形在函数执行过程中就显示出来,这样装饰器的输出就会在图形之后打印:

import time
import seaborn as sns
import matplotlib.pyplot as plt

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"运行时长: {end - start:.2f}秒")
        print("感谢使用!")
        return result
    return wrapper

@timer
def Klasse3():
    # 你的数据处理逻辑
    data = sns.load_dataset("tips")
    # 生成柱状图
    sns.catplot(x="day", y="total_bill", data=data)
    # 强制立即显示图形
    plt.show()

# 调用函数
Klasse3()

方法2:修改装饰器,统一处理图形显示

如果你不想在每个绘图函数里都加plt.show(),可以修改timer装饰器,让它在打印统计信息前先触发所有图形的显示:

import time
import seaborn as sns
import matplotlib.pyplot as plt

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        # 在打印前强制显示所有未渲染的图形
        plt.show()
        end = time.time()
        print(f"运行时长: {end - start:.2f}秒")
        print("感谢使用!")
        return result
    return wrapper

@timer
def Klasse3():
    data = sns.load_dataset("tips")
    sns.catplot(x="day", y="total_bill", data=data)

Klasse3()

这两种方法都能确保Seaborn的柱状图先显示在Notebook中,然后才出现装饰器输出的运行时长和感谢语。

内容的提问来源于stack exchange,提问作者Janneman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:12:53