pandas 在使用bbox_inches='tight'调用matplotlib的savefig后,如何获得图像的大小?

6ie5vjzr  于 2023-05-05  发布在  其他
关注(0)|答案(1)|浏览(161)

我想得到调用savefig(bbox_inches='tight')得到的图像尺寸。我使用bbox_inches来避免剪切X轴上的垂直文本和图像外部的图例。
img_width, img_height = fig.get_size_inches()
这是我的第一个猜测,但是它返回的大小忽略了bbox_inches=tight的变化(即带有图例和剪切的x轴文本的大小)。
This questions表示如何设置宽度和高度。我想知道宽度和高度。
我想避免从磁盘上阅读图像并检查宽度和高度的选项,因为这涉及到添加另一个库(例如PIL或OpenCV)和不必要的磁盘读取。

3pmvbmvn

3pmvbmvn1#

除非我弄错了,否则图像大小不应该像绘图区域那样改变:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4])

print('Before tight_layout')
img_width, img_height = fig.get_size_inches()
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
print(f"Fig size:  ({img_width:.2f}, {img_height:.2f})")
print(f"Axes size: ({bbox.width:.2f}, {bbox.height:.2f})")

fig.set_layout_engine('tight')
fig.savefig('image.png')

print('After tight_layout')
img_width, img_height = fig.get_size_inches()
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
print(f"Fig size:  ({img_width:.2f}, {img_height:.2f})")
print(f"Axes size: ({bbox.width:.2f}, {bbox.height:.2f})")

plt.close()

输出:

Before tight_layout
Fig size:  (6.40, 4.80)
Axes size: (4.96, 3.70)
After tight_layout
Fig size:  (6.40, 4.80)
Axes size: (5.78, 4.26)

检查:

arr_height, arr_width, _ = plt.imread('image.png').shape
print(f"Image size: ({arr_width / fig.dpi:.2f}, {arr_height / fig.dpi:.2f})")

# Output
Image size: (6.40, 4.80)

相关问题