You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matplotlib绘制箱线图后无法保持初始图像尺寸的技术咨询

解决Matplotlib箱线图保存后尺寸不符的问题

我碰到过好多次类似的情况,问题主要出在Matplotlib自动调整坐标轴范围和保存时的裁剪逻辑上,咱们一步步拆解:

问题根源

  1. 自动坐标轴空白填充:你设置了whis=[0,100]让须线对应数据的min和max,但Matplotlib默认会在坐标轴两端留一些空白(padding),导致实际显示的x轴范围比[min(data), max(data)]宽一点;而bbox_inches='tight'参数会自动裁掉这些空白,最终图像宽度就比你设置的小了。
  2. 画布尺寸与数据范围未绑定:你计算的fig_width是期望的像素宽度,但没有把这个宽度和x轴的数据范围做映射,Matplotlib不知道要让x轴的每个单位对应多少像素,自然没法保持你要的尺寸比例。

解决方案

核心思路是强制绑定x轴范围到数据的min和max,手动消除所有不必要的空白,让箱线图刚好填满整个画布,修改后的代码如下:

import math
import matplotlib.pyplot as plt

png_width = 280
png_height = 120
data = [你的数据列表]  # 替换为实际数据
data_min = min(data)
data_max = max(data)

# 直接将像素尺寸转为Matplotlib使用的英寸单位(dpi是画布的分辨率)
dpi = plt.rcParams['figure.dpi']
fig_width_inch = png_width / dpi
fig_height_inch = png_height / dpi

fig_cnt += 1
fig = plt.figure(fig_cnt, figsize=(fig_width_inch, fig_height_inch), frameon=False, clear=True)
ax = fig.add_subplot(111)

# 绘制箱线图,patch_artist=True方便后续调整箱体样式(可选)
bp = ax.boxplot(data, vert=False, widths=0.2, whis=[0, 100], patch_artist=True)

# 设置中位数颜色
for median in bp['medians']:
    median.set(color='#000000')

# 关键:强制x轴范围严格匹配数据的min到max,消除两端空白
ax.set_xlim(data_min, data_max)
# 调整y轴范围,让箱线图在垂直方向居中(boxplot默认y轴位置为1)
ax.set_ylim(0.8, 1.2)

# 关闭所有坐标轴元素
ax.axis('off')

# 保存时去掉bbox_inches='tight',因为我们已经手动适配了画布尺寸,无需额外裁剪
plt.savefig(filepath, pad_inches=0, transparent=True, dpi=dpi)
plt.close()

关键修改点说明

  • 固定坐标轴范围ax.set_xlim(data_min, data_max)强制x轴从数据最小值到最大值,没有额外空白,确保首尾须线刚好占满画布宽度。
  • y轴范围调整:设置窄范围让箱线图在垂直方向居中,避免上下出现空白被裁剪。
  • 简化figsize计算:直接用像素值/dpi转成英寸,比之前的计算更直观准确。
  • 移除bbox_inches='tight':这个参数会自动裁剪画布空白,但我们已经手动调整了坐标轴范围,画布刚好适合箱线图,保留它反而会破坏设置的尺寸。

这样修改后,保存的图像宽度会严格等于你设置的png_width,箱线图的首尾须线距离也会和画布宽度一致,完美满足叠加到网格图的需求。

内容的提问来源于stack exchange,提问作者cwhisperer

火山引擎 最新活动