Matplotlib中表格大小变化时保持表格间间距一致
问题根源
间距变动的核心原因有两点:
plt.subplots_adjust(hspace=0.1)中的hspace是相对比例值,表示子图间距占子图平均高度的比例,并非固定物理尺寸。当第二个表格行数变化时,子图高度分配改变,0.1这个比例对应的实际间距大小会同步变化。- 没有固定表格行高,matplotlib会根据子图大小自动缩放表格,进一步放大了间距误差。
实现方案
核心思路是绕开相对比例的间距规则,手动控制所有尺寸:
- 预先定义固定的全局参数:单行表格物理高度、表格间固定间距、画布上下边距、表格字体大小,确保单行表格的尺寸不会随子图大小变化。
- 每次绘图时,根据传入的各表格行数,动态计算画布总高度:
总高度 = 上下边距 + 所有表格总行数*单行高度 + (表格数-1)*固定间距。 - 从画布顶部向下逐个计算每个子图的归一化坐标,保证相邻子图的间隙始终等于预设的固定间距值,完全不受表格行数变化影响。
- 创建表格后关闭自动字体缩放,固定字体大小,保证表格实际尺寸和预设值一致。
修正后代码
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
相关产品推荐
相关产品推荐

