博主需要在全球地图上标注出化石点数据,由于化石产出点一样或很近,导致呈现的效果不理想,如果自动添加标签,又会重叠。近期看到adjustText库可以自动调整标签,避免重复。本文记录学习过程,并将在最后展示博主的图示,期待一下效果。
手动调整注释位置也不可能
学习资料来自adjustText官网——https://adjusttext.readthedocs.io/en/latest/
adjustText帮助用于调整matplotlib绘图中的注释文本布局,尽可能避免或减少注释文件间的重叠。
通过检测文本的边界重叠,尝试移动它们以减少重叠来实现功能。本库受到用于R/gglot2的ggrepel启发。
该库仅有1个函数:
adjustText.adjust_text(texts, x=None, y=None, objects=None, avoid_self=True, force_text: tuple[float, float] = (0.1, 0.2), force_static: tuple[float, float] = (0.1, 0.2), force_pull: tuple[float, float] = (0.01, 0.01), force_explode: tuple[float, float] = (0.01, 0.02), expand: tuple[float, float] = (1.05, 1.1), explode_radius='auto', ensure_inside_axes=True, expand_axes=False, only_move={'explode': 'xy', 'pull': 'xy', 'static': 'xy', 'text': 'xy'}, ax=None, min_arrow_len=5, time_lim=0.5, *args, **kwargs)
反复地、迭代地调整文本的位置
在绘图完成后再调用adjust_text()函数。
参数 | 传参类型 | 含义 |
---|---|---|
text | 列表 | matplotlib.text.Text对象组成的列表 |
x | 类似数组 | 文本注释的坐标x值;如若没有即用文本坐标 |
y | 同上 | 同上 |
objects | 列表或PathCollection | 需要避开的matplotlib对象;这些对象必须有get_window_extent()方法;或是一个PathCollection或一组Bbox对象 |
avoid_self | 布尔值,默认True | 是否让文本避开原始位置 |
force_text | 元组,默认(0.1, 0.2) | 文本的调整空间就是两值乘积的面积 |
force_static | 元组,默认(0.05, 0.1) | 散点和其他对象之间的调整空间 |
force_pull | 浮点数,default (0.001, 0.0001) | 也是调整空间,将文本拉向原始位置 |
force_explode | 浮点数,default (0.001, 0.0001) | 也是调整空间,文本间保持的距离 |
expand | 类似数组,default (1.05, 1.2) | 有两个值的列表或元组(x, y),将文本拉开的距离控制 |
explode_radius | 浮点数或"auto",默认"auto" | 在一开始的显示单位中,检查离文本最近的对象移动多远,那么在100的数量级上“auto”使用的是最大文本的大小 |
ensure_inside_axes | 布尔值,默认True | 是否强制文本停留在坐标轴内 |
expand_axes | 布尔值,默认Default | 在调整位置之前,是否扩展坐标轴以适应所有文本 |
only_move | 字典,默认{‘points’:‘xy’, ‘text’:‘xy’, ‘objects’:‘xy’} | 对于某些类型的重叠,将文本移动限制在某些轴上的字典。有效的键是points 、text 和objects 。有效值有’ ‘、’ x ‘、’ y ‘和’ xy ‘。例如,only_move={’ points ': ’ y ', ’ text ': ’ xy ', ’ objects ': ’ xy '}禁止文本沿x轴移动,因为它们与点重叠。 |
ax | matplotlib axe,默认当前axe (plt.gca()) | ax object with the plot |
min_arrow_len | 浮点数,默认5 | 如果文本比这个距离目标点更近,则不要添加箭头(以显示单位为单位)。 |
time_lim | 浮点数,默认0.1 | 调整需要多少时间,以秒为单位 |
kwargs | 在所有优化完成后,任何参数都将被输入obj:FancyArrowPatch,以便在需要时绘制连接的箭头。 |
没有很好地解决。而且该库作者早已停更。官方文档和脚本有出入,应该是后续有人优化过。有时间仔细研究研究。