
在 Jupyter Notebook/Lab 中使用 fig.show() 循环显示多个 Plotly 图表时,常出现仅保留最近 8 个图表、旧图被自动清除的现象;根本原因在于前端渲染机制与输出缓冲区限制,可通过禁用自动清理或改用 display() 显式控制输出来稳定展示全部图表。
在 jupyter notebook/lab 中使用 `fig.show()` 循环显示多个 plotly 图表时,常出现仅保留最近 8 个图表、旧图被自动清除的现象;根本原因在于前端渲染机制与输出缓冲区限制,可通过禁用自动清理或改用 `display()` 显式控制输出来稳定展示全部图表。
Plotly 图表在 Jupyter 中默认通过 fig.show() 渲染,该方法会调用底层的 IPython.display.display() 并附带 clear=True 行为(尤其在旧版 plotly 或特定 Jupyter 环境中),导致每次调用时清空前一个输出单元格——当循环快速生成多个图表时,Jupyter 内核的输出缓冲区(如 OutputArea 的默认最大缓存数)可能进一步触发自动裁剪,表现为“只显示最后 8 个图”。
✅ 推荐解决方案:使用 IPython.display.display() 替代 fig.show()
display() 是更底层、更可控的输出接口,它默认不主动清理历史输出,能确保每个图表独立保留在 notebook 中:
from IPython.display import display
import plotly.express as px
# 示例数据
df = px.data.iris()
myColumnList = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
for i in myColumnList:
for j in myColumnList:
if i != j: # 避免 x=y 的冗余图
fig = px.scatter(df, x=i, y=j, title=f'Scatter: {i} vs {j}')
display(fig) # ✅ 关键:替代 fig.show()⚠️ 注意事项与最佳实践:
- 不要混用 fig.show() 和 display(fig):二者底层机制不同,混合使用可能导致不可预期的输出行为;
-
显式设置 renderer(可选):若需统一渲染后端(如 'notebook' 或 'jupyterlab'),可在首次绘图前配置:
import plotly.io as pio pio.renderers.default = "notebook" # 或 "jupyterlab"
- 内存与性能提醒:一次性渲染数十个交互式 Plotly 图表会显著增加 notebook 体积和浏览器内存占用;生产环境建议导出为 HTML 或按需触发(如配合 ipywidgets.Button);
- 验证环境兼容性:您当前使用的 plotly==5.16.0 已足够新,问题通常不源于版本过低,而更可能与 Jupyter 输出管理逻辑相关(如某些插件或自定义内核配置)。
? 总结:fig.show() 的“自动清理”特性并非 bug,而是设计使然(便于单图迭代调试);但在批量展示场景下,应主动降级为 display() 以获得确定性输出行为。这是 Plotly 官方文档中明确推荐的 Jupyter 批量渲染模式 —— 简洁、可靠、无需额外依赖。










