You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置plt.figtext参数使标签固定在图片正下方后导出为PDF

问题根源

你当前的问题来自两个核心错误:

  1. plt.figtext 用的是归一化的画布坐标,y=0是画布底部、y=1是画布顶部,你固定写死y=-1.0完全适配不了不同行数的标签
  2. 存图时用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:57:00