基于单元格内容的Jupyter笔记本中matplotlib内联图的行为

13

我很好奇了解Jupyter笔记本中内嵌matplotlib图的下述行为。我将展示三种情况:

情况1:不同的单元格中导入和绘制。在这种情况下,只需连续执行两个单元格一次,即可显示绘图结果。

enter image description here


情况2:相同的单元格中导入并绘制。在这种情况下,执行单元格[1]一次时,不会出现图形(下方图片为空)。当再次执行相同的单元格[1]时,图形才会出现。这就是下面提到的问题。

enter image description here


情况3:在一个单元格中添加%matplotlib inline,同时导入和绘制。在这种情况下,预期地,在执行单元格一次后,图形将出现。因此这里没有任何问题。

enter image description here


问题

之前曾提出过类似的帖子(点击此处),仅涉及情况2和3。连接帖子中ImportanceOfBeingErnest的评论澄清说,Jupyter可能按默认方式配置为使用%matplotlib inline

因此我的问题并不是为什么情况1和2可以不使用%matplotlib inline而正常工作,而是我想了解:

  • 为什么在情况2中,需要执行两次单元格[1]才能显示图形,而情况1中只需执行一次单元格[1][2]即可显示?当在不同的单元格中调用import matplotlib.pyplot as plt时,它在后台是否以不同的方式调用/激活了后端?

系统规格

import sys
print (sys.version)
# 3.6.5 |Anaconda, Inc.

import matplotlib
print (matplotlib.__version__)
# 2.2.2

! jupyter notebook --version
# 5.5.0

我不知道答案,但是有其他情况下重复执行命令会有帮助,以及第一个单元格的行为与众不同 - ImportanceOfBeingErnest
@ImportanceOfBeingErnest:感谢您的回复和提供的链接。我很高兴这不是一个琐碎的问题。虽然它并不影响我的工作,但我今天注意到了,并且很好奇它到底是什么问题。 - Sheldore
所有情况下,在执行单元格时绘制图形。已在notebook 6.4.3jupyter 1.0.0jupyterlab 3.1.7中进行了测试。我投票关闭此问题,因为无法重现。 - Trenton McKinney
1个回答

1
我查看了您的代码并搜索了一些互联网上的帖子,但未能找到明确的答案。在我看来,这是与Matplotlib版本后端有关的问题。但它不应成为阻碍您进行工作/学习的问题。在我的情况下,第二种情况下的单元格1只需执行一次即可实现,并且我的Matplotlib信息如下所示:
import matplotlib
print(matplotlib.__version__)
3.4.3

我还想和你确认几件事情:

  1. 你必须知道 %matplotlib inline 可以替代 plt.show()

  2. 如今,plt.show() 是更受欢迎的显示图形的方式。


2
第二点“plt.show()是现在显示图形的更流行方式”已经过时了,这是您在2023年发布的。通常,在现代Jupyter(而不是Colab)中,这不再需要。如果检测到在单元格中生成了一个与maptlotlib相关的绘图对象,则会显示它。(您必须实际选择退出显示它以获得对何时显示绘图的精细控制。)此外,关于第一点,“%matplotlib inline”本质上是默认设置,在现代Jupyter中不需要。尽管如此,这些观点仍然对于故障排除和某些边缘情况非常有用。 - Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接