如何设置plt.figtext参数使标签固定在图片正下方后导出为PDF
问题根源
你当前的问题来自两个核心错误:
plt.figtext用的是归一化的画布坐标,y=0是画布底部、y=1是画布顶部,你固定写死y=-1.0完全适配不了不同行数的标签- 存图时用了
bbox_inches="tight"参数会自动裁剪画布空白,固定坐标的文字位置会被裁剪逻辑打乱,自然会出现要么重叠要么太远的问题
最优解决方案:直接用FPDF加标签(无需合成到图片)
你已经在使用FPDF库,完全没必要把标签写到图片里,直接插入图片后在PDF画布上写文字即可,位置可控性极强,不会出现适配问题:
from fpdf import FPDF import matplotlib.pyplot as plt pdf = FPDF() # 统一配置字体,需要中文支持的话可自行加载对应字体 pdf.set_font("Arial", size=12) for idx in range(0,15): # 原有逻辑生成图片img,此处省略你的原有图片处理代码 # ... # 保存纯图片(不要加figtext) plt.imshow(img) plt.axis('off') plt.title(n_id) img_path = f'testplot{idx}.jpg' plt.savefig(img_path, bbox_inches="tight") plt.clf() # 清空画布避免内容残留 # 插入PDF并添加标签 pdf.add_page() # 插入图片,设置宽度占满页面可写区域,高度自动等比缩放 img_w = pdf.w - 2*pdf.l_margin pdf.image(img_path, x=pdf.l_margin, w=img_w) # 计算图片底部位置,加5mm作为图片和标签的间距 text_start_y = pdf.get_y() + 5 pdf.set_xy(pdf.l_margin, text_start_y) # 逐行输出标签 for lab in lab_out: pdf.cell(0, txt=str(lab), ln=True) pdf.output("yourfile.pdf", "F")
如果你坚持要把标签和图片合成再插入PDF
可以用上下分子图的方式,动态根据标签行数调整下方文本区域的高度,避免位置错乱:
for idx in range(0,15): # 原有逻辑生成img和标签列表lab_out,此处省略你的原有处理代码 # ... label_count = len(lab_out) # 动态设置画布高度:图片固定高度 + 标签行数*0.5英寸(系数可自行调整) fig_height = 6 + label_count * 0.5 fig, (ax_img, ax_text) = plt.subplots(nrows=2, ncols=1, figsize=(8, fig_height), gridspec_kw={'height_ratios': [6, label_count*0.5]}) # 上方子图渲染图片 ax_img.imshow(img) ax_img.axis('off') ax_img.set_title(n_id) # 下方子图渲染标签,隐藏坐标轴 text_content = '\n'.join([str(lab) for lab in lab_out]) ax_text.text(0, 1, text_content, va='top', fontsize=12) ax_text.axis('off') # 保存合成后的图片 img_path = f'testplot{idx}.jpg' plt.savefig(img_path, bbox_inches="tight") plt.close(fig) # 插入PDF pdf.add_page() pdf.image(img_path, x=pdf.l_margin, w=pdf.w - 2*pdf.l_margin) pdf.output("yourfile.pdf", "F")
额外注意
你原代码中内外层循环都用了c作为变量名,会导致变量覆盖出错,建议修改内层循环的变量名。
内容的提问来源于stack exchange,提问作者Entropie_13
相关产品推荐
相关产品推荐

