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

Matplotlib中表格大小变化时保持表格间间距一致

问题根源

间距变动的核心原因有两点:

  • plt.subplots_adjust(hspace=0.1)中的hspace是相对比例值,表示子图间距占子图平均高度的比例,并非固定物理尺寸。当第二个表格行数变化时,子图高度分配改变,0.1这个比例对应的实际间距大小会同步变化。
  • 没有固定表格行高,matplotlib会根据子图大小自动缩放表格,进一步放大了间距误差。
实现方案

核心思路是绕开相对比例的间距规则,手动控制所有尺寸:

  1. 预先定义固定的全局参数:单行表格物理高度、表格间固定间距、画布上下边距、表格字体大小,确保单行表格的尺寸不会随子图大小变化。
  2. 每次绘图时,根据传入的各表格行数,动态计算画布总高度:总高度 = 上下边距 + 所有表格总行数*单行高度 + (表格数-1)*固定间距。
  3. 从画布顶部向下逐个计算每个子图的归一化坐标,保证相邻子图的间隙始终等于预设的固定间距值,完全不受表格行数变化影响。
  4. 创建表格后关闭自动字体缩放,固定字体大小,保证表格实际尺寸和预设值一致。
修正后代码
import matplotlib.pyplot as plt

# 固定全局尺寸参数,单位为英寸
ROW_HEIGHT = 0.22    # 单行表格高度
TABLE_GAP = 0.15     # 表格之间的固定间距
TOP_MARGIN = 0.2     # 画布顶部边距
BOTTOM_MARGIN = 0.2  # 画布底部边距
FONT_SIZE = 10

table1CellText = [[1, 2, 3, 4, 5, 6]]
table2CellText = [[1, 2, 3, 4, 5, 6] for _ in range(14)]
table3CellText = [[1, 2, 3, 4, 5, 6] for _ in range(2)]
table4CellText = [[1, 2, 3, 4, 5, 6] for _ in range(2)]


def showPlot(table1CellText, table2CellText, table3CellText, table4CellText):
    tables = [table1CellText, table2CellText, table3CellText, table4CellText]
    # 计算每个表格的物理高度
    table_heights = [len(t) * ROW_HEIGHT for t in tables]
    # 动态计算画布总高度
    total_height = TOP_MARGIN + BOTTOM_MARGIN + sum(table_heights) + TABLE_GAP * (len(tables)-1)
    # 画布宽度固定为6.5,和原代码保持一致
    total_width = 6.5
    
    fig = plt.figure(figsize=(total_width, total_height))
    axes = []
    # 从顶部向下逐个放置子图
    current_top = 1 - TOP_MARGIN / total_height
    for h in table_heights:
        ax_h = h / total_height
        ax_bottom = current_top - ax_h
        # 添加子图,位置参数为[left, bottom, width, height](归一化坐标)
        ax = fig.add_axes([0.05, ax_bottom, 0.9, ax_h])
        ax.axis("off")
        axes.append(ax)
        # 更新下一个子图的顶部位置,减去固定间距
        current_top = ax_bottom - TABLE_GAP / total_height
    
    # 逐个绘制表格
    for ax, cell_text in zip(axes, tables):
        table = ax.table(
            cellText=cell_text,
            loc="center",
            cellLoc="center"
        )
        table.auto_set_font_size(False)
        table.set_fontsize(FONT_SIZE)
        # 固定单元格缩放比例,避免自动调整,可根据显示效果微调系数
        table.scale(1, ROW_HEIGHT * 3.6)

    plt.show()

# 第一次绘图
showPlot(table1CellText, table2CellText, table3CellText, table4CellText)
# 移除第二个表格的7行后再次绘图
for _ in range(7):
    table2CellText.pop(0)
showPlot(table1CellText, table2CellText, table3CellText, table4CellText)
效果说明

不管第二个表格的行数如何变化,相邻表格之间的物理间距始终等于预设的TABLE_GAP值,不会随表格高度变化而变动。可以根据实际显示需求调整ROW_HEIGHT、TABLE_GAP、FONT_SIZE等参数,适配想要的显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:54:33