关于Notebook推迟绘图至下一单元格及代码组织的技术问询
嘿,这方案完全贴合你的需求!咱们直接用Matplotlib的默认上下文特性就能实现,不用纠结已经废弃的plt.hold了,具体这么做👇
核心思路
利用Matplotlib在Notebook中默认的绘图状态保留机制:只要不手动关闭画布(Figure),所有后续的绘图命令都会作用在同一个画布上。这样就能把核心绘图逻辑和细节美化拆到两个单元格,配合隐藏输入的扩展工具,完美适配你的幻灯片/PDF生成需求。
第一个单元格(核心意图,需隐藏输入)
这里只放最核心的绘图代码,不添加任何细节也不显示图像——读者在幻灯片/PDF里看不到这部分,但查看原始Notebook时能看到背后的逻辑:
import numpy as np import matplotlib.pyplot as plt # 定义数据与核心函数 t = np.linspace(0, 2*np.pi, 100) def f(t): return np.sin(t) # 仅执行核心绘图操作,无输出 plt.plot(t, f(t))
第二个单元格(细节美化与显示,需显示输入)
这里补充所有绘图细节,最后调用plt.show()显示完整图像——这部分是读者在幻灯片/PDF里会看到的内容:
# 添加各类细节标注 plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Sine Wave') plt.grid(True) plt.ylim(-1.2, 1.2) # 显示最终完整图像 plt.show()
进阶优化(更可控的对象式写法)
如果担心多个单元格之间的画布冲突,推荐用对象式绘图显式创建画布和坐标轴,逻辑更清晰:
第一个单元格(隐藏输入)
import numpy as np import matplotlib.pyplot as plt t = np.linspace(0, 2*np.pi, 100) def f(t): return np.sin(t) # 显式创建画布和坐标轴,后续操作都绑定到这个坐标轴上 fig, ax = plt.subplots() ax.plot(t, f(t))
第二个单元格(显示输入)
# 通过坐标轴对象添加细节 ax.set_xlabel('Time (s)') ax.set_ylabel('Amplitude') ax.set_title('Sine Wave') ax.grid(True) ax.set_ylim(-1.2, 1.2) plt.show()
适配你的幻灯片/PDF需求
用Notebook的隐藏输入扩展工具(比如Jupyter Notebook的Hide Input插件、JupyterLab的相关扩展)把第一个单元格的输入隐藏,生成幻灯片或PDF时,读者只会看到第二个单元格的代码和最终图像;而想要了解背后逻辑的人,查看原始Notebook就能看到完整的代码拆分。
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

