如何让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
相关产品推荐
相关产品推荐

