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

如何使用ipywidgets实现Matplotlib绘图的网格或横向布局?

解决方案:用ipywidgets排列Matplotlib绘图成网格/横向布局

你的问题出在Matplotlib绘图在Output组件中的渲染逻辑——Jupyter默认会自动渲染Matplotlib图形,导致图形在Output外额外显示,进而打乱布局。只需调整图形的显示方式,就能实现预期的排列效果。

修正后的横向布局(HBox)代码

import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display

output = widgets.Output()
output1 = widgets.Output()

with output:
    with plt.style.context("ggplot"):
        fig = plt.figure(figsize=(4,4))
        plt.plot([1,2,3], [4,5,6])
        display(fig)  # 显式在Output组件内渲染图形
        plt.close(fig)  # 关闭图形避免额外自动渲染

with output1:
    with plt.style.context("ggplot"):
        fig = plt.figure(figsize=(4,4))
        plt.plot([1,2,3], [1,8,5])
        display(fig)
        plt.close(fig)

# 仅返回HBox组件,避免同时执行多个布局代码导致重复显示
widgets.HBox([output1, output])

修正后的TwoByTwoLayout网格布局代码

如果需要双行双列的网格布局,同样遵循显式渲染+关闭图形的逻辑:

import matplotlib.pyplot as plt
import ipywidgets as widgets
from ipywidgets import TwoByTwoLayout
from IPython.display import display

output = widgets.Output()
output1 = widgets.Output()

with output:
    with plt.style.context("ggplot"):
        fig = plt.figure(figsize=(4,4))
        plt.plot([1,2,3], [4,5,6])
        display(fig)
        plt.close(fig)

with output1:
    with plt.style.context("ggplot"):
        fig = plt.figure(figsize=(4,4))
        plt.plot([1,2,3], [1,8,5])
        display(fig)
        plt.close(fig)

TwoByTwoLayout(top_left=output, top_right=output1)

扩展:用GridBox实现更灵活的多网格布局

如果需要3x3或更多行列的网格,推荐使用GridBox:

import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display

# 创建多个Output组件
outputs = [widgets.Output() for _ in range(4)]

# 为每个Output填充图形
for idx, out in enumerate(outputs):
    with out:
        with plt.style.context("ggplot"):
            fig = plt.figure(figsize=(3,3))
            plt.plot([1,2,3], [idx+1, idx*2, idx*3])
            display(fig)
            plt.close(fig)

# 配置2x2网格布局
widgets.GridBox(outputs, layout=widgets.Layout(grid_template_columns="repeat(2, 1fr)"))

关键注意事项

  • 必须用display(fig)在Output组件内显式渲染图形,避免Jupyter自动在布局外输出
  • 用plt.close(fig)关闭已渲染的图形,防止重复显示
  • 代码末尾仅返回一个布局组件,不要同时执行多个布局创建语句

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:13