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

