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

如何让ipympl绘图自适应填充其画布宽度?

让ipympl绘图自适应Jupyter Notebook视口宽度

你遇到的问题是:设置fig.canvas.layout.width='100%'仅让widget容器自适应宽度,但matplotlib绘图本身的尺寸未同步更新。这是因为matplotlib的figure默认使用固定英寸尺寸(默认6.4x4.8英寸,对应640x480像素,dpi=100),不会自动跟随widget容器的尺寸变化。

解决方案:监听widget尺寸变化,动态调整figure大小

通过监听ipympl画布的尺寸变化事件,实时将figure的尺寸与widget容器的实际像素尺寸同步,实现绘图自适应视口宽度。

完整代码示例:

import numpy as np
from matplotlib import pyplot as plt

%matplotlib widget

# 创建绘图,开启tight_layout避免元素溢出
fig, ax = plt.subplots(tight_layout=True)
ax.plot(np.arange(10))

# 设置widget容器为100%宽度,工具栏居底
fig.canvas.layout.width = '100%'
fig.canvas.toolbar_position = 'bottom'

def sync_figure_to_canvas(change):
    # 获取canvas实际渲染后的像素宽度
    canvas_pixel_width = fig.canvas.get_window_extent().width
    # 将像素宽度转换为matplotlib使用的英寸单位(除以figure的dpi)
    fig_inch_width = canvas_pixel_width / fig.dpi
    # 保持原有的宽高比,计算对应的高度
    original_aspect_ratio = fig.get_figheight() / fig.get_figwidth()
    fig_inch_height = fig_inch_width * original_aspect_ratio
    # 更新figure尺寸
    fig.set_size_inches(fig_inch_width, fig_inch_height)

# 监听canvas的尺寸变化事件,触发同步函数
fig.canvas.observe(sync_figure_to_canvas, names='size')

补充说明

  • get_window_extent()方法用于获取canvas实际渲染后的像素范围,其width属性即为当前widget容器的实际像素宽度。
  • 转换为英寸单位是因为matplotlib的set_size_inches()方法使用英寸作为尺寸单位,换算时需要除以figure的dpi值(默认100,可通过fig.dpi查看/修改)。
  • 保持原有宽高比可以避免绘图拉伸变形,若需要固定高度或自定义比例,可直接修改fig_inch_height的计算逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:46:08