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

如何在matplotlib图上方居中放置PrettyTable且不扭曲原图表

问题原因

你原来的写法有两个核心问题:

  • 用axe.text()基于坐标轴坐标定位,位置会随x/y轴的数值范围变化,无法固定在画布上方
  • 没有提前给画布预留表格空间,直接插入文本会挤压甚至覆盖原有图表内容,且默认字体不是等宽的,会导致PrettyTable的边框、列对齐错乱
修复方案

我们通过预留画布空白、用画布全局坐标定位、指定等宽字体三个改动实现需求,修改后完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from prettytable import PrettyTable


myTable = PrettyTable(["Student Name", "Class", "Section", "Percentage"])
  
# Add rows
myTable.add_row(["Leanord", "X", "B", "91.2 %"])
myTable.add_row(["Penny", "X", "C", "63.5 %"])
myTable.add_row(["Howard", "X", "A", "90.23 %"])
myTable.add_row(["Bernadette", "X", "D", "92.7 %"])
myTable.add_row(["Sheldon", "X", "A", "98.2 %"])
myTable.add_row(["Raj", "X", "B", "88.1 %"])
myTable.add_row(["Amy", "X", "B", "95.0 %"])

points = np.linspace(-5, 5, 256)
y1 = np.tanh(points) + 0.5
y2 = np.sin(points) - 0.2

# 调整画布尺寸,确保有足够空间放下内容
fig, axe = plt.subplots(dpi=300, figsize=(8, 6))
# 把绘图区向下压缩,预留上方30%的空间放表格,避免挤压原图
fig.subplots_adjust(top=0.7)

axe.plot(points, y1)
axe.plot(points, y2)
axe.legend(["tanh", "sin"])

# 把PrettyTable转成字符串,用画布全局坐标定位
# 0.5对应水平方向居中,0.85对应垂直方向上方位置,指定等宽字体保证表格对齐正常
fig.text(0.5, 0.85, str(myTable), 
         ha="center", va="top", 
         family="monospace", fontsize=6)

plt.show()
关键改动说明
  • fig.subplots_adjust(top=0.7):将坐标轴绘图区的上边界限制在画布高度的70%位置,上方预留的30%空间专门放表格,不会改变原图的长宽比例、不会出现扭曲
  • 用fig.text()而非axe.text():前者用的是整个画布的归一化坐标(取值范围0-1),设置ha="center"即可实现永久水平居中,不受坐标轴数值范围变化影响
  • 指定family="monospace"等宽字体:PrettyTable的对齐逻辑依赖空格占位,只有等宽字体才能保证表格边框、列内容对齐不会错乱
  • 可根据实际表格大小调整fontsize和fig.text的第二个参数(垂直位置),适配不同长度的表格内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:15:03