You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用for循环为两个子图各加两条迹时Plotly生成多图的问题

问题原因及解决办法

原因

你碰到的多图表问题,本质是Jupyter Notebook的自动渲染机制在起作用:

  • fig.add_trace()会返回修改后的figure对象,你在循环里用括号把两次add_trace的链式调用包起来,这行代码执行完就会返回当前状态的fig。
  • Jupyter Notebook里,如果单元格内的语句执行后返回了可渲染的对象(比如Plotly的Figure),而且没加尾部分号,Notebook会自动把这个对象渲染出来。
  • 第一次循环结束时,fig只完成了第一个子图的两条迹添加,这个不完整的fig被自动渲染成第一张图;第二次循环完成后,fig是完整的双生子图,最后fig.show()又主动触发一次渲染,就出现了两张图。
  • 新笔记本环境可能因为初始化状态不同,没触发中间的自动渲染,所以只显示了最终的图。

另外你的代码漏了导入numpy(np.arange需要import numpy as np),不过这不是多图的直接原因。

解决办法

要只显示一张完整的双生子图,两种简单修正方式:

方法1:给循环内的语句加尾部分号

阻止Jupyter自动渲染中间状态的fig:

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import numpy as np  # 补上缺失的导入

fig = make_subplots(rows=2, cols=1, shared_xaxes=True)
for i in np.arange(2): 
     (fig.add_trace(go.Scatter(x=[0, 1, 2], y=[10, 11, 12]),
                    row=i+1, col=1)
     .add_trace(go.Scatter(x=[2, 3, 4], y=[100, 110, 120]),
                    row=i+1, col=1));  # 添加分号抑制自动显示
fig.show()

方法2:拆分链式调用

不用链式写法,分开调用add_trace,这样循环内的语句不会返回可渲染对象:

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import numpy as np

fig = make_subplots(rows=2, cols=1, shared_xaxes=True)
for i in np.arange(2): 
    fig.add_trace(go.Scatter(x=[0, 1, 2], y=[10, 11, 12]), row=i+1, col=1)
    fig.add_trace(go.Scatter(x=[2, 3, 4], y=[100, 110, 120]), row=i+1, col=1)
fig.show()

两种方法都能让Notebook只显示最终的完整双生子图,解决额外图表的问题。

内容的提问来源于stack exchange,提问作者dumalo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:48:15