我在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()
的输出
1条答案
按热度按时间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(“视网膜”)缩放,因此在决定保留哪一个时,这是一个需要考虑的因素。