如何解决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
相关产品推荐
相关产品推荐

