Matplotlib如何批量将annotations注释整体向右偏移指定距离
统一偏移matplotlib注释的实现方法
不需要手动逐个调整注释位置,直接通过matplotlib的annotate内置偏移参数即可实现所有注释统一右移,解决注释被折线遮挡的问题。
核心原理
原代码中注释的文本锚点和散点坐标完全重合,因此会被叠在上方的折线遮挡。只需要给所有注释设置统一的位置偏移量,即可一次性把所有文本挪到散点右侧。
两种常用偏移方案
方案1:按数据坐标偏移(适配固定轴范围场景)
直接在原x坐标基础上加固定的x轴单位偏移值,适合x轴范围不会后续调整的场景,修改后完整代码如下:
import numpy as np import matplotlib.pyplot as plt fs = 20 figure, ax1 = plt.subplots() ax1.set_xlim(1.6, 2.0) ax1.set_ylim(-2, 5) annotations = ['$1.66$', '$1.68$', '$1.72$', '$1.74$', '$1.76$'] xpoint = [1.66, 1.68, 1.72, 1.74, 1.76] ypoint = [3.47072347e-01, 5.05186795e+00, 1.61807901e+01, 5.60855544e+01, 6.07027325e+02] ax1.scatter(xpoint, np.log10(ypoint), color='k') # 配置统一偏移量,数值可根据显示效果微调 offset_x = 0.008 for i, label in enumerate(annotations): x_val = xpoint[i] y_val = np.log10(ypoint[i]) ax1.annotate( label, (x_val, y_val), xytext=(x_val + offset_x, y_val), # 文本统一右移固定x轴距离 ha='left', va='center', fontsize=fs ) ax1.tick_params(labelsize=fs) figure.savefig("plot.svg", bbox_inches='tight')
方案2:按像素点偏移(通用场景推荐)
使用textcoords='offset points'将偏移单位设置为相对于散点的像素距离,偏移效果不会随x轴范围缩放变化,适配性更强,仅需修改循环内annotate部分即可,其余代码不变:
offset_x = 5 # 向右偏移5个像素,可按需调整 for i, label in enumerate(annotations): x_val = xpoint[i] y_val = np.log10(ypoint[i]) ax1.annotate( label, (x_val, y_val), xytext=(offset_x, 0), # x方向偏移,y方向无偏移 textcoords='offset points', # 偏移参考系为相对于标注点的像素单位 ha='left', va='center', fontsize=fs )
可选优化
如果不想偏移太多距离,也可以给注释加一层无描边白底,不用大幅偏移就能避免被折线遮挡,只需在annotate参数中添加bbox配置:
ax1.annotate( # ...其余参数保持不变 bbox=dict(facecolor='white', edgecolor='none', pad=1.5) )
原始效果参考:
内容的提问来源于stack exchange,提问作者liuyun
相关产品推荐
相关产品推荐

