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

She*_*ore 6 python matplotlib jupyter jupyter-notebook

我很想了解下面解释matplotlib的 Jupyter 笔记本中内联图的行为。我将展示三种情况:

案例 1:单独的单元格中导入和绘图。在这种情况下,在连续执行两个单元格一次后会出现绘图。

在此处输入图片说明


案例 2:同一个单元格中导入和绘图。在这种情况下,当单元格[1]执行一次时不会出现图(下图中没有图)。然而,当[1]再次执行相同的单元格时会出现该图。这是作为以下问题提出的问题。

在此处输入图片说明


案例 3:添加%matplotlib inline到案例 2,全部在一个单元格中。在这种情况下,正如预期的那样,在执行一次单元格后会出现绘图。所以这里根本没有问题。

在此处输入图片说明


类似的帖子已被要求在此之前,这只是提及案件2和3的注释ImportanceOfBeingErnest上澄清,Jupyter可能在某种程度上使用配置的链接后%matplotlib inline默认。

所以我的问题不是为什么案例 1 和案例 2 没有%matplotlib inline,而是我想了解

  • 为什么[1]案例 2 中的单元格需要执行两次才能显示绘图,而单元格[1][2]案例 1 中的单元格只执行一次就可以工作?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
Run Code Online (Sandbox Code Playgroud)

小智 1

我检查了你的代码并从互联网上搜索了一些帖子,但未能找到明确的答案。在我看来,这是后端与 matplotlib 版本的问题。它不应该成为阻碍你继续工作/学习的问题。

在我的例子中,案例2中的单元格1只需执行一次即可实现,我的matplotlib信息如下所示:

import matplotlib
print(matplotlib.__version__)
3.4.3
Run Code Online (Sandbox Code Playgroud)

我还想跟大家确认几件事:

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

  2. plt.show()是当今更流行的显示图表的方法。

  • 第 2 点,“plt.show() 是当今更流行的显示图表的方式”,在 2023 年(即您发布它的时间)已过时。通常,现代 Jupyter(不是 Colab)不再需要这个。如果检测到单元格中生成了与 maptlotlib 相关的绘图对象,则会显示该对象。(您实际上必须选择不显示它,才能很好地控制何时显示绘图。)此外,关于第 1 点,“%matplotlib inline”本质上是默认设置,在现代 Jupyter 中不需要。不过,了解这些要点对于故障排除和一些边缘情况仍然很有帮助。 (2认同)