使用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
相关产品推荐
相关产品推荐

