在Jupyter中使用Seaborn Objects绘制子图时出现重复绘图问题
Jupyter中Seaborn Objects子图重复显示的原因
问题场景
在Jupyter环境中运行以下代码绘制子图时,未添加plt.show()会出现两幅完全相同的绘图:
import matplotlib.pyplot as plt import seaborn as sns import seaborn.objects as so diamonds = sns.load_dataset("diamonds") f, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(6, 3)) p = so.Plot(diamonds, x="carat", y="price") p.add(so.Dots()).scale(y="log").on(ax1).plot() p.add(so.Dots(), color="clarity").scale(color="crest").on(ax2).plot() # plt.show() # 注释该行时出现重复绘图
未添加plt.show()时的输出:
原因解析
- Jupyter的自动渲染机制:Jupyter Notebook/Lab会自动显示单元格最后一个表达式的返回值。Seaborn Objects的
.plot()方法执行时,不仅会把图形绘制到指定的ax1/ax2轴上,还会返回包含当前图形的对象。当最后一行.plot()的返回值未被接收(比如用变量赋值),Jupyter会自动渲染这个返回的图形。 - Matplotlib后端的自动显示:同时,
plt.subplots()创建的Figure对象(变量f)会被Matplotlib的inline后端自动检测并显示,这就导致同一图形被两次渲染,出现重复。
解决办法
- 添加
plt.show():plt.show()会显式渲染当前画布,且执行后返回None,Jupyter不会对None进行渲染,因此只会显示一次图形。 - 接收
.plot()的返回值:把最后一行的.plot()赋值给一个变量(比如_ = p.add(...).plot()),避免Jupyter自动渲染返回的图形对象。
内容的提问来源于stack exchange,提问作者user21559775
相关产品推荐
相关产品推荐

