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
相关产品推荐
相关产品推荐

