如何仅裁剪Matplotlib图表上下空白并保持指定宽度?
解决Matplotlib仅裁剪上下空白并固定宽度的问题
要实现只裁剪图表顶部和底部空白、同时保持宽度与figsize设置的6英寸一致,可通过以下两种方法实现:
方法1:自定义裁剪区域固定宽度
手动构造裁剪框,锁定左右边界以保持6英寸宽度,仅根据轴的实际高度调整上下边界:
import numpy as np from matplotlib import pyplot as plt # 创建画布,固定宽度6英寸 fig, ax = plt.subplots(constrained_layout=True, figsize=(6, 10)) ax.imshow(np.zeros((1000, 1000))) # 获取轴的实际占比(图形坐标,0-1范围) bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) # 固定宽度为6英寸,计算对应的图形坐标右边界 target_width_ratio = 6 / fig.get_figwidth() # 构造裁剪框:左0,右为固定宽度比例,上下取轴的实际位置 crop_bbox = [0, bbox.y0, target_width_ratio, bbox.y0 + bbox.height] plt.savefig('short_plot.png', dpi=100, bbox_inches=crop_bbox, pad_inches=0) plt.close()
方法2:结合tight_layout与轴边界裁剪
关闭constrained_layout,用tight_layout自动调整间距后,直接指定裁剪框的左右为0到6英寸,上下取轴的实际范围:
import numpy as np from matplotlib import pyplot as plt fig, ax = plt.subplots(figsize=(6, 10)) ax.imshow(np.zeros((1000, 1000))) plt.tight_layout(pad=0) # 自动消除不必要的内边距 # 获取轴的实际边界 bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) # 直接指定裁剪框的宽度为6英寸,高度适配轴的实际高度 plt.savefig('short_plot.png', dpi=100, bbox_inches=(0, bbox.y0, 6, bbox.y0 + bbox.height), pad_inches=0) plt.close()
这两种方法都能保证保存后的图表宽度严格为6英寸,同时自动裁剪掉顶部和底部的多余空白,高度适配图表内容的实际尺寸。
内容的提问来源于stack exchange,提问作者user3549378
相关产品推荐
相关产品推荐

