matplotlib - 如何确定 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)从何而来?
解决方案
获取原始图像大小
使用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')
将基础轴强制转换为所需的形状
手动定义figsize
和rect
使用像素尺寸和所需的 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')
那么范围像素将正好是 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
推荐阅读
- json - 如何使用 Retrofit 在 Flutter post api 调用中将对象作为参数传递?
- python - XlsxWriter:从单独的 python 文件生成多工作表工作簿?
- javascript - 反应 onSelect 和 onDeselect
- django - 多个 SearchVectorFields 上的 SearchRank
- php - Heroku:如何部署与 PHP API REST 连接的 Angular 应用程序以获取数据?
- firebase - React Native :: 构建错误 | 依赖不兼容
- parquet - PyArrow 从 S3 中的文件获取元数据
- python - Python:编写高效的条件检查
- python-3.x - 无法在熊猫中读取 csv 文件
- r - R如何使用我正在创建的列中的先前值