如何让Matplotlib旋转后的表头文本与单元格底部对齐?
表头旋转后文本与单元格底部齐平的解决方法
问题描述
旋转表格表头文本后,为容纳旋转内容设置了单元格多行高度,但尝试将文本底部对齐时,表头文本底部始终存在额外空白,且单元格高度越大空白越多。手动通过cell.get_text().set_y()调整文本位置也无效果,如何让文本与单元格底部完全齐平?
原代码
import numpy as np import matplotlib.pyplot as plt data = np.array([[1, 2], [3, 4]]) colLabels = ["short", "Long Column Name"] rowLabels = ["Row A", "Row B"] fig = plt.figure() ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[]) the_table = ax.table(cellText=data,rowLabels=rowLabels, rowLoc='right', colLabels=colLabels, colLoc='right', loc='center') for k, cell in the_table._cells.items(): if k[0] == 0: # 表头 cell.get_text().set_rotation(-45) cell.get_text().set_verticalalignment('bottom') cell.set_height(0.8) cell.get_text().set_y(0) # 无任何效果 plt.show()
问题图示

解决方法
问题根源在于Matplotlib默认旋转模式会基于文本边界框计算位置,导致旋转后文本偏移。只需添加rotation_mode='anchor'参数,让旋转以文本锚点为基准,再配合位置微调即可解决:
修改后的代码
import numpy as np import matplotlib.pyplot as plt data = np.array([[1, 2], [3, 4]]) colLabels = ["short", "Long Column Name"] rowLabels = ["Row A", "Row B"] fig = plt.figure() ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[]) the_table = ax.table(cellText=data,rowLabels=rowLabels, rowLoc='right', colLabels=colLabels, colLoc='right', loc='center') for k, cell in the_table._cells.items(): if k[0] == 0: # 表头单元格 txt = cell.get_text() txt.set_rotation(-45) txt.set_verticalalignment('bottom') txt.set_horizontalalignment('right') txt.set_rotation_mode('anchor') # 关键:设置旋转锚点模式 txt.set_position((1, 0)) # 定位文本到单元格右下角(x=1右对齐,y=0底部对齐) cell.set_height(0.8) plt.show()
原理说明
rotation_mode='anchor':让文本围绕锚点旋转,而非文本边界框中心,避免旋转后产生不必要的空白偏移。set_position((1, 0)):将文本锚点定位到单元格右下角,结合right水平对齐和bottom垂直对齐,确保旋转后的文本底部完全贴合单元格底部。
内容的提问来源于stack exchange,提问作者Fadi Alzammar
相关产品推荐
相关产品推荐

