matplotlib 使用jupyter中的seaborn.objects和子图时,会输出重复的图

wkyowqbh  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(115)

我在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()的输出

xoefb8l8

xoefb8l81#

您看到这一点是因为您同时从计算单元返回Plot并使用matplotlib-inline pyplot后端。
当从Jupyter Notebook单元格的最后一行返回Plot对象时,它将通过Jupyter的丰富显示系统渲染并显示在单元格输出中。您也可以调用display(p)来挂钩相同的机制。
另外,因为您使用的是matplotlib-inline pyplot后端(隐式;这是Jupyter的默认值),由单元创建的任何pyplot图都将被捕获并添加到单元输出中。
这些是完全不同的机制,彼此不了解。
正如您所注意到的,将plt.show添加到单元格的末尾将禁用第一种机制,因为Plot不再从单元格“返回”。(虽然plt.show是一个很好的例子,因为它没有返回值,你也可以“捕获”最后的图(例如_ = p.add(...))或者添加一个尾随的分号,类似于你禁用其他单元格输出的方式。
或者,您可以调用plt.close来禁用第二种机制。但是如果您只是将plt.close设置为单元格的最后一行,则由于上一段中给出的原因,您根本不会看到任何绘图。您需要确保也显示Plot
您可能会注意到这两个图像的大小/分辨率不同。Plot通过第一种机制(丰富显示)生成的图像默认使用hi-dpi(“视网膜”)缩放,因此在决定保留哪一个时,这是一个需要考虑的因素。

相关问题