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

如何解决Matplotlib横向条形图存为PDF时柱形过薄、调figsize生成空白文件问题

解决方案

核心实现逻辑

问题核心是默认情况下matplotlib会固定画布高度,条形数量多时会自动压缩每个条形的高度导致变细。你只需要根据每次的条形数量动态计算画布高度,固定单个条形的厚度参数即可实现需求。

具体实现步骤

  • 先预设2个固定参数:画布宽度、单个条形的厚度,所有图表都复用这两个值
  • 每次生成图表前,先统计当前图表的条形总数n
  • 按规则动态计算画布高度:画布高度 = 上下边距总高度 + 单条对应画布高度 * 条形数n
  • 调整绘图顺序,避免保存PDF时出现空白

代码示例

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

# 全局固定参数,所有图表统一
FIXED_FIG_WIDTH = 10  # 固定画布宽度,单位英寸
FIXED_BAR_HEIGHT = 0.4  # 固定条形厚度,所有图表的条形厚度都和这个值一致
SINGLE_BAR_FIG_HEIGHT = 1  # 每个条形对应分配1英寸的画布高度,可自行调整间距
MARGIN_HEIGHT = 2  # 上下预留边距总高度,单位英寸

# 假设你的数据集是个列表,每个元素对应一张图的(x值列表, y轴标签列表)
all_chart_data = [
    ([10,20,30], ["标签1","标签2","标签3"]),
    ([5,15,25,35,45], ["标签A","标签B","标签C","标签D","标签E"]),
    # 更多图表数据
]

with PdfPages("output.pdf") as pdf:
    for x_values, y_labels in all_chart_data:
        bar_count = len(y_labels)
        # 动态计算当前画布高度
        current_fig_height = MARGIN_HEIGHT + bar_count * SINGLE_BAR_FIG_HEIGHT
        # 先创建画布,再绘图!顺序不能反
        plt.figure(figsize=(FIXED_FIG_WIDTH, current_fig_height))
        # 绘图时传入固定的height参数
        plt.barh(y=range(bar_count), width=x_values, height=FIXED_BAR_HEIGHT)
        # 设置y轴标签
        plt.yticks(range(bar_count), y_labels)
        # 自动调整布局,避免标签溢出、内容空白
        plt.tight_layout()
        # 先保存到PDF,再考虑是否展示
        pdf.savefig()
        # 如果不需要弹窗展示可以不加,加的话必须放在savefig之后
        # plt.show()
        # 关闭当前画布避免内存溢出
        plt.close()

PDF空白问题排查

之前修改figsize后PDF空白基本都是操作顺序错误导致,按以下规则排查即可:

  • 必须先调用plt.figure(figsize=xxx)创建画布,再调用plt.barh等绘图函数,顺序反了内容会画在旧画布上,新画布空白
  • 保存savefig前不要调用plt.show()、plt.close(),前者会默认清空当前画布内容
  • 必须加plt.tight_layout()自动调整边距,避免内容超出画布边界导致看起来空白

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:09:02