首页 > 解决方案 > 当 plt.plot() 调用在其他单元格中完成时, plt.show() 为空

问题描述

语境

我必须为物理作业写一个 Jupyter 笔记本,我必须绘制一些图表来显示一些数量的演变等......

我必须通过每次在代码和 Markdown 单元之间交替来解释我编写的几乎每一行代码,包括plot()调用,这就是我的问题所在。简单来说,我有类似的东西:


我的代码

我们首先导入matplotlib.pyplot模块:

from matplotlib import pyplot as plt

接下来,我们从数据中创建值列表:

# making up stuff
x_values = range(10)
doubles = [x * 2 for x in x_values]
squares = [x**2 for x in x_values]

我们首先绘制 的曲线doubles

%matplotlib inline

plt.plot(x_values, doubles, color='red', label='x * 2')

它显示了双打的图表(并且仅适用于双打)

然后我们绘制squares

%matplotlib inline

plt.plot(x_values, squares, color='red', label='x^2')

它显示了正方形的图形(并且仅适用于正方形)

最后,我们配置我们的图表并显示它:

%matplotlib inline

plt.xlabel("x")
plt.ylabel("f(x)")
plt.ylim(0, 50)
plt.xlim(0, 11)
plt.legend()
plt.grid(True)
plt.show()

它显示了一个空图,标签、网格和限制设置正确,但根本没有曲线或图例


预期的

最后一个单元格显示了一个图表,其中包含两条曲线和图例以及我配置的所有内容

发生了什么/我的问题

最后一个单元格显示一个没有曲线或图例的空图

我试过的

但是,如果我尝试将plot()调用与所有其他内容一起放在最后一个单元格中,我确实会得到预期的图表,包括曲线、图例等……但不幸的是,我无法用我的实际分配来做到这一点:/

我还尝试了该行的几乎所有值%matplotlib inline,我尝试了多个单元格、多个位置等......但这并没有解决我的问题

通过谷歌搜索,笔记本的第一行似乎与 matplotlib 和所有这些行为有点不同,但这几乎不是我笔记本中的第一个单元格,所以不可能是这样。

老实说,我不知道为什么会这样。我想我在某个地方读到pyplot了某种状态机,所以也许它分布在多行上的事实使它感到困惑,但对于其他事物(标签、样式等),它按预期工作,所以我现在一头雾水。

所以我想我的问题是:这是正常的行为,是一个错误,还是我只是错过了什么?

编辑:似乎使用fig, ax = plt.subplots(1, 1)然后在ax作品上绘图,但问题是它增加了我无法轻易解释的复杂性,它相当笨重,并且它没有回答“为什么它在同一个单元格中时有效,但不是当线条在不同的细胞中时?”

标签: pythonmatplotlibplotjupyter-notebook

解决方案


这是 Jupyter Notebook 的正常行为。它期望一个绘图的所有命令都在同一个单元格中,然后当单元格结束时,它会渲染绘图。这就是为什么你不需要plt.show(). 顺便说一句,%matplotlib inline每个笔记本只需要一次 IPython 魔术命令,除非你想在不同的显示模式之间切换。

要注释每一行绘图命令,您当然可以在单元格中使用 Python 注释。如果你必须使用 Markdown,一个简单的解决方法是通过编号注释枚举命令行,或者只是在某些重要的行设置注释,然后在下一个 Markdown 单元格中引用这些编号。

请注意,此注释问题并非特定于绘图。例如,您将如何注释函数定义的每一行?整个定义必须在一个单元格中。


推荐阅读