首页 > 解决方案 > 如何确定 matplotlib.image.AxesImage 的 [fig] 大小(以像素为单位)?

问题描述

此代码使用 matplotlib 渲染 Lenna 图像,

import urllib
import matplotlib.pyplot as plt
imgurl = 'https://upload.wikimedia.org/wikipedia/en/thumb/7/7d/Lenna_%28test_image%29.png/330px-Lenna_%28test_image%29.png'
f = urllib.request.urlopen(imgurl)
img = plt.imread(f)
axi = plt.imshow(img)

在此处输入图像描述

matplotlib.image.AxesImageaxi的实例在哪里

如何确定 AxesImage 的 [fig] 大小(以像素为单位)?期望值可能 (330, 330)

我试过axi.get_window_extent()

Bbox([[112.68, 36.00000000000003], [330.12, 253.44000000000003]])

这些值(112.68、330.12)从何而来?

标签: matplotlib

解决方案


获取原始图像大小

使用AxesImage.get_size()

axi.get_size()

# (330, 330)

将坐标区范围转换为像素

通过以下方式调整窗口范围Figure.dpi

axi = plt.imshow(img)
fig = plt.gcf()

bbox = axi.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width = bbox.width * fig.dpi
height = bbox.height * fig.dpi

# 334.79999999999995 217.43999999999997

不是330x330 的原因是因为如何plt.imshow()处理纵横比。如果您使用 绘图aspect='auto',则底层轴的形状变得可见:

axi = plt.imshow(img, aspect='auto')

具有自动方面的莲娜


将基础轴强制转换为所需的形状

手动定义figsizerect使用像素尺寸和所需的 dpi:

width_px, height_px, _ = img.shape
dpi = 96

figsize = (width_px / dpi, height_px / dpi) # inches
rect = [0, 0, 1, 1] # [left, bottom, width, height] as fraction of figsize

fig = plt.figure(figsize=figsize, dpi=dpi) # in inches
axes = fig.add_axes(rect=rect)
axi = axes.imshow(img, aspect='auto')

具有自动纵横比但手动轴的 lenna

那么范围像素将正好是 330x330:

bbox = axi.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width = bbox.width * fig.dpi
height = bbox.height * fig.dpi

# 330.0 330.0

推荐阅读