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

如何在Matplotlib顶部axes上方无缝放置等宽PNG图片?

解决方案

要实现顶部axes上方无缝放置等宽、原比例的PNG图片,关键是结合图片宽高比计算inset_axes的位置和尺寸,同时调整布局避免图片被裁剪,具体步骤如下:

1. 计算图片的宽高比

先获取图片原始宽高,算出宽高比,确保图片缩放后保持原比例:

from PIL import Image
import os
import matplotlib.pyplot as plt

img = Image.open(os.path.join(MY_DIR, img_name), formats=["png"])
aspect_ratio = img.height / img.width  # 高度/宽度,得到宽高比

2. 正确设置inset_axes的参数

inset_axes的bounds参数[x0, y0, width, height]是相对于父axes的归一化坐标(父axes左下角为(0,0),右上角为(1,1)):

  • x0=0:图片左边缘和父axes左对齐
  • y0=1.0:图片底部和父axes顶部完全衔接(父axes顶部的归一化坐标是1.0)
  • width=1.0:图片宽度和父axes一致
  • height=aspect_ratio:根据宽高比设置高度,保证图片比例不变

修改后的关键代码:

fig, axes = plt.subplots(nrows=3, ncols=1, sharex=True)
for i, ax in enumerate(axes):
    if i == 0:
        img = Image.open(os.path.join(MY_DIR, img_name), formats=["png"])
        aspect_ratio = img.height / img.width
        # 正确设置inset_axes的bounds参数
        axin = ax.inset_axes([0.0, 1.0, 1.0, aspect_ratio])
        axin.imshow(img, alpha=1)
        axin.axis("off")

3. 调整figure顶部边距避免图片被裁剪

默认的figure顶部边距可能不足以容纳上方的图片,需要通过subplots_adjust预留足够空间:

# 计算需要预留的顶部边距:父axes高度占figure的比例 * 图片高度比例,再加少量额外留白
plt.subplots_adjust(top=1 - (1/3)*aspect_ratio - 0.05)
plt.show()

原理说明

  • 父axes的归一化坐标中,y=1.0对应其顶部边缘,将inset_axes的y0设为1.0,就能让图片底部和父axes顶部无缝衔接。
  • 用图片的宽高比设置inset_axes的高度,确保图片缩放后不会变形,同时宽度和父axes完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:17:14