如何为matplotlib.pyplot.text()设置x、y轴不同坐标系?
实现x轴数据坐标、y轴轴坐标的文本定位
当然有超简便的实现方式!你要的这种混合坐标系需求,matplotlib早就为我们准备好了专门的工具——matplotlib.transforms.blended_transform_factory(),用它可以轻松组合两种不同的坐标系,完美解决你说的“垂直位置固定,水平位置随数据视图调整”的问题。
核心思路
matplotlib的坐标系变换支持拆分x和y轴分别设置:
- 用
ax.transData作为x轴变换:让文本的水平位置完全跟随数据坐标系,当你调整x轴显示范围时,文本会自动跟着移动到对应数据位置 - 用
ax.transAxes作为y轴变换:让文本的垂直位置基于轴的相对位置(0对应轴底部,1对应轴顶部),不管y轴范围怎么调整,文本都固定在你设定的垂直位置
完整代码示例
import matplotlib.pyplot as plt from matplotlib.transforms import blended_transform_factory # 生成示例数据 x_values = [1, 3, 5, 7, 9] y_values = [4, 2, 5, 1, 3] # 创建绘图对象 fig, ax = plt.subplots(figsize=(8, 4)) ax.plot(x_values, y_values, marker='o', label='示例数据') # 创建混合变换:x用数据坐标,y用轴坐标 blended_trans = blended_transform_factory( ax.transData, # x轴:数据坐标系 ax.transAxes # y轴:轴坐标系 ) # 添加文本:x是数据值,y是轴的相对位置(这里0.8代表距离顶部20%的位置) ax.text( x=5, # 数据坐标系下的x位置 y=0.8, # 轴坐标系下的y位置(0-1) s='垂直固定,水平随数据移动', transform=blended_trans, ha='center', # 水平居中对齐 va='center', # 垂直居中对齐 bbox=dict(facecolor='lightblue', alpha=0.6, pad=5) # 添加背景框增强可读性 ) # 测试调整x轴范围,验证文本位置变化 ax.set_xlim(0, 10) ax.legend() plt.show()
效果验证
当你拖动调整x轴的显示范围(比如缩小或放大x轴),你会发现文本的水平位置始终对应数据中的x=5的位置,而垂直位置一直保持在轴的80%高度处,完全符合你的需求!
这个技巧我平时做可视化时经常用到,比如给时序图添加固定在侧边的标注,或者给散点图添加随数据点水平移动但垂直固定的说明,非常实用~
内容的提问来源于stack exchange,提问作者BayesianMonk
相关产品推荐
相关产品推荐

