python - 当 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
作品上绘图,但问题是它增加了我无法轻易解释的复杂性,它相当笨重,并且它没有回答“为什么它在同一个单元格中时有效,但不是当线条在不同的细胞中时?”
解决方案
这是 Jupyter Notebook 的正常行为。它期望一个绘图的所有命令都在同一个单元格中,然后当单元格结束时,它会渲染绘图。这就是为什么你不需要plt.show()
. 顺便说一句,%matplotlib inline
每个笔记本只需要一次 IPython 魔术命令,除非你想在不同的显示模式之间切换。
要注释每一行绘图命令,您当然可以在单元格中使用 Python 注释。如果你必须使用 Markdown,一个简单的解决方法是通过编号注释枚举命令行,或者只是在某些重要的行设置注释,然后在下一个 Markdown 单元格中引用这些编号。
请注意,此注释问题并非特定于绘图。例如,您将如何注释函数定义的每一行?整个定义必须在一个单元格中。
推荐阅读
- android - 我正在尝试将新活动添加到我的项目中,但它给了我错误
- c# - 在后台声明我的套接字和我的位置的连接的最佳位置是什么?
- django - 如何检查列表中多个表单的验证?
- javascript - 在另一个文件中使用函数中的 var
- sql - 我需要按一列分组并显示一个数据集中的更多列
- java - 连接管理器的 OC4j 到 Weblogic 迁移问题
- marklogic - 使用 MarkLogic java api 丰富:cts.entityHighlight
- python - python:名称解析说明?
- node.js - Electron Nodejs - 我需要在网页内容中嵌入一个 pdf 查看器
- vuejs2 - NuxtJs 在哪里声明计算属性