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

