如何在Matplotlib中精准放置文本于首个y轴刻度标签正上方
解决方案
要精准将文本“Rank”放置在首个y轴刻度标签正上方,无需试凑硬编码数值,可通过获取刻度标签的实际位置并利用matplotlib坐标变换实现,适配不同参数的图表。
修改后代码
import matplotlib.pyplot as plt import pandas as pd import numpy as np from pylab import rcParams rcParams['figure.figsize'] = 8, 6 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) df = pd.DataFrame.from_records(zip(np.arange(1,30))) df.plot.barh(width=0.8, ax=ax, legend=False) # 移除边框与刻度线 ax.spines[['right', 'top', 'left', 'bottom']].set_visible(False) ax.tick_params(left=False, bottom=False) ax.tick_params(axis='y', which='major', pad=36) ax.set_title("Rankings") # 获取首个y轴刻度标签对象 first_y_label = ax.yaxis.get_ticklabels()[0] # 获取标签的位置与对应坐标变换规则 label_pos = first_y_label.get_position() label_transform = first_y_label.get_transform() # 在标签正上方放置文本 ax.annotate( "Rank", xy=label_pos, xycoords=label_transform, xytext=(0, 15), # 向上偏移15像素,可根据需求调整 textcoords='offset points', ha='center', # 水平居中对齐标签 va='bottom' ) plt.show()
核心逻辑说明
- 通过
ax.yaxis.get_ticklabels()[0]获取第一个y轴刻度标签的对象,直接定位目标位置的载体 - 利用标签自身的坐标变换规则(
get_transform()),避免手动转换坐标的复杂操作 - 使用
annotate配合像素偏移(offset points),确保文本始终在标签正上方且水平居中,不受图表尺寸、内边距变化影响
内容的提问来源于stack exchange,提问作者CodeTrek
相关产品推荐
相关产品推荐

