IPython中Plotly执行更新语句时提前绘图的抑制方法
解决IPython中Plotly更新语句频繁弹出绘图的问题
在IPython环境(通过Neovim+tmux+slime逐行发送代码)中,执行fig.update_layout、fig.update_xaxes这类图形更新语句时,每一行都会弹出绘图窗口,但直接用python3 file.py运行脚本时,仅会显示fig.show()对应的最终绘图。以下是几种抑制中间弹窗、仅保留最终绘图的解决方案:
方法1:禁用Plotly自动渲染
通过修改Plotly的渲染配置,让所有更新操作默认不自动弹窗,仅在调用fig.show()时显示最终图形。
import plotly.graph_objects as go import numpy as np import plotly.io as pio # 禁用自动渲染,仅在显式调用show()时显示图形 pio.renderers.default = 'none' time = np.linspace(0, 1, 100) data1 = np.cos(time) data2 = np.sin(time) fig = go.Figure( [go.Scatter(x=time, y=data1), go.Scatter(x=time, y=data2)]) fig.update_layout(title_text='title') # 无弹窗 fig.update_xaxes(title_text='x-axis') # 无弹窗 fig.update_yaxes(title_text='y-axis') # 无弹窗 fig.show() # 仅此处弹出最终绘图
方法2:链式调用更新方法
将所有更新操作链式调用,让IPython仅返回一次修改后的fig对象,避免逐行触发渲染。
import plotly.graph_objects as go import numpy as np time = np.linspace(0, 1, 100) data1 = np.cos(time) data2 = np.sin(time) fig = go.Figure( [go.Scatter(x=time, y=data1), go.Scatter(x=time, y=data2)]) # 链式执行所有更新,减少IPython返回对象的次数 (fig.update_layout(title_text='title') .update_xaxes(title_text='x-axis') .update_yaxes(title_text='y-axis')) fig.show() # 弹出最终绘图
方法3:在更新语句末尾加分号
利用IPython的特性:在语句末尾添加分号;,可以抑制对返回对象的自动显示。
import plotly.graph_objects as go import numpy as np time = np.linspace(0, 1, 100) data1 = np.cos(time) data2 = np.sin(time) fig = go.Figure( [go.Scatter(x=time, y=data1), go.Scatter(x=time, y=data2)]) fig.update_layout(title_text='title'); # 末尾加分号,不触发弹窗 fig.update_xaxes(title_text='x-axis'); # 末尾加分号,不触发弹窗 fig.update_yaxes(title_text='y-axis'); # 末尾加分号,不触发弹窗 fig.show() # 弹出最终绘图
原因说明
IPython默认会自动显示所有非None的返回值,而Plotly的update_*方法会返回修改后的fig对象,因此逐行执行时每一次都会触发渲染;直接运行脚本时,只有显式调用fig.show()才会触发图形显示。
内容的提问来源于stack exchange,提问作者alpastor
相关产品推荐
相关产品推荐

