0

0

解决 Jupyter 中 Plotly 循环绘图仅显示最后 8 个图表的问题

心靈之曲

心靈之曲

发布时间:2026-03-07 14:33:28

|

809人浏览过

|

来源于php中文网

原创

解决 Jupyter 中 Plotly 循环绘图仅显示最后 8 个图表的问题

在 Jupyter(Notebook 或 Lab)中使用 fig.show() 循环生成多个 Plotly 图表时,旧图表可能被自动清除或不可见;本文详解其成因、验证方法及稳定显示全部图表的三种专业解决方案。

在 jupyter(notebook 或 lab)中使用 `fig.show()` 循环生成多个 plotly 图表时,旧图表可能被自动清除或不可见;本文详解其成因、验证方法及稳定显示全部图表的三种专业解决方案。

Plotly 在 Jupyter 环境中默认采用“动态输出”机制:每次调用 fig.show() 会将图表渲染为一个独立的前端组件(plotly-graph-div),但 Jupyter 内核对连续输出单元(尤其是富媒体输出)存在隐式限制——并非 Plotly 本身的硬性限制,而是 Jupyter 前端对重复/高频 application/vnd.plotly.v1+json MIME 类型输出的渲染策略与内存管理行为所致。尤其在旧版 Jupyter Notebook(如 6.x)或特定配置下,系统可能自动折叠、复用或卸载早期输出区域,造成“只看到最后 8 个图”的错觉。

值得注意的是,该问题不具备绝对可复现性:如官方社区验证所示,在 JupyterLab 3.4.8+/4.1.2 或 Notebook 7.1.0+ 中运行以下代码,23 个图表均可正常并列显示:

import plotly.express as px
df = px.data.iris()
for i in range(23):
    fig = px.scatter(x=[0,1,2,3,4], y=[i, i+1, i+4, i+9, i+16], title=f"Figure {i+1}")
    fig.show()

若你仍遇到图表消失现象,说明环境存在兼容性瓶颈(如老旧内核、扩展冲突或资源限制)。以下是三种经生产环境验证的可靠解法:

✅ 方案一:启用 render_mode="iframe"(推荐用于 Notebook)

强制以独立 iframe 渲染每个图表,彻底规避前端 DOM 复用问题:

Reecho睿声
Reecho睿声

Reecho AI:超拟真语音合成与瞬时语音克隆平台

下载
import plotly.io as pio
pio.renderers.default = "iframe"  # 或 "iframe_connected"(需本地服务)

for i in myColumnList:
    for j in myColumnList:
        fig = px.scatter(df, x=i, y=j, title=f"{i} vs {j}")
        fig.show()

⚠️ 注意:iframe 渲染器需浏览器支持 iframe,且离线环境可能受限;iframe_connected 更适合交互式调试(需启动本地 Plotly 服务)。

✅ 方案二:批量构建子图(高效 & 轻量)

避免循环 show(),改用 make_subplots 或 facet_col 一次性呈现全部关系:

import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go

# 方法 2a:使用 facet_grid(适用于结构化变量对)
df_long = df.melt(id_vars=df.columns.difference(myColumnList), 
                   value_vars=myColumnList, var_name='variable', value_name='value')
fig = px.scatter(df_long, x='variable', y='value', facet_col='variable', facet_col_wrap=3)
fig.update_layout(title="All Scatter Pairs (Faceted)")
fig.show()

# 方法 2b:手动子图布局(完全可控)
fig = make_subplots(rows=len(myColumnList), cols=len(myColumnList),
                    subplot_titles=[f"{i} vs {j}" for i in myColumnList for j in myColumnList])
for idx, (i, j) in enumerate([(i,j) for i in myColumnList for j in myColumnList]):
    row = idx // len(myColumnList) + 1
    col = idx % len(myColumnList) + 1
    scatter = go.Scatter(x=df[i], y=df[j], mode='markers', name=f"{i}-{j}")
    fig.add_trace(scatter, row=row, col=col)
fig.update_layout(height=400*len(myColumnList), showlegend=False)
fig.show()

✅ 方案三:导出为 HTML 并统一打开(适合归档与分享)

将所有图表保存为独立 HTML 文件,再通过 IPython.display.IFrame 或系统命令集中查看:

from IPython.display import IFrame, display
import os

html_files = []
for i in myColumnList:
    for j in myColumnList:
        fig = px.scatter(df, x=i, y=j, title=f"{i} vs {j}")
        filename = f"scatter_{i}_{j}.html"
        fig.write_html(filename)
        html_files.append(filename)

# 批量嵌入(Jupyter 内显示前 5 个示例)
for html in html_files[:5]:
    display(IFrame(html, width="100%", height="500px"))
print(f"✅ 已生成 {len(html_files)} 个 HTML 图表,详见本地目录。")

? 总结建议

  • 优先升级环境:确保 jupyterlab>=4.0 或 notebook>=7.0 + plotly>=5.15,多数渲染异常可自然消除;
  • 避免纯循环 show():它本质是“调试快捷方式”,非生产级可视化方案;
  • 按需选择策略:快速探索用 iframe,分析报告用 facet,长期存档用 HTML;
  • 禁用冲突扩展:如 jupyter-contrib-nbextensions 中的“Hinterland”或“Variable Inspector”可能干扰输出流,可临时禁用验证。

通过以上任一方法,即可稳定、可扩展地在 Jupyter 中展示任意数量的 Plotly 图表,彻底摆脱“第 9 个图就消失”的困扰。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4218

2024.08.14

iframe写法有哪些
iframe写法有哪些

iframe写法有基本Iframe写法、嵌套Iframe写法、自适应宽高的Iframe写法、带有样式和属性的Iframe写法、内联Iframe写法和使用JavaScript动态创建Iframe写法。种写法都有自己的特点和适用场景。根据实际需求,选择合适的写法可以实现所需的功能和效果。

489

2023.10.19

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

3

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

21

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

108

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号