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

IPywidgets GridspecLayout仅显示最后一张图表的解决求助

解决ipywidgets Output组件中仅显示最后一张Plotly图表的问题

你的问题核心在于Plotly的fig.show()默认行为和ipywidgets的Output组件上下文不兼容:在Jupyter环境中,fig.show()会将所有图表都渲染到代码单元格的全局输出区,而非你指定的Output组件内,最终只有最后一次fig.show()的结果会被保留显示。

修复方案

有两种可靠的解决方式,任选其一即可:

方式1:使用display()替代fig.show()

导入IPython的display方法,在Output的上下文块中用display(fig)渲染图表,它会严格遵循当前上下文,将图表绑定到对应的Output容器。

修改后的完整代码:

import plotly.express as px
import ipywidgets as widgets
from ipywidgets import GridspecLayout, Layout, Output
from IPython.display import display

com_lay = Layout(
    width='100%', 
    height='300px',       
    border='1px solid gray',
    overflow='auto'       
)

# 创建Output组件
out_bar = Output(layout=com_lay)
out_line = Output(layout=com_lay)
out_scat = Output(layout=com_lay)
out_hist = Output(layout=com_lay)

# 渲染散点图
df = px.data.iris()
with out_scat:
    fig = px.scatter(df, x='sepal_width', y='sepal_length', color='species')
    display(fig)

# 渲染柱状图
df_tips = px.data.tips()
with out_bar:
    fig = px.bar(df_tips, x='day', y='total_bill', color='sex', barmode='group')
    display(fig)

# 渲染折线图
df_line = px.data.gapminder().query("country == 'Canada'")
with out_line:
    fig = px.line(df_line, x='year', y='gdpPercap', title='GDP per Capita - Canada')
    display(fig)

# 渲染直方图
with out_hist:
    fig = px.histogram(df_tips, x='total_bill', nbins=30, color='sex')
    display(fig)

# 布局网格
grid = GridspecLayout(
    4, 1,
    layout=Layout(
        width='100%',
        height='auto',
        grid_gap='10px'
    )
)

# 分配图表到网格
grid[0, 0] = out_line
grid[1, 0] = out_bar
grid[2, 0] = out_scat
grid[3, 0] = out_hist

grid

方式2:指定Plotly渲染器为widget

无需额外导入,直接在fig.show()中指定renderer="widget",生成ipywidgets兼容的图表组件,自动适配Output容器:

# 示例:修改散点图的渲染代码
with out_scat:
    fig = px.scatter(df, x='sepal_width', y='sepal_length', color='species')
    fig.show(renderer="widget")

原理说明

  • 默认情况下,fig.show()使用notebook渲染器,它会将图表输出到当前代码单元格的全局输出区域,所有之前的图表会被覆盖,仅保留最后一次输出。
  • display(fig)或renderer="widget"会将图表绑定到当前的Output上下文,确保每个图表都渲染到对应的容器中,不会互相覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:57:34