You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用adjust_text避免文本覆盖Matplotlib的误差棒与数据连线?

如何使用adjust_text避免文本覆盖Matplotlib的误差棒与数据连线?

针对你遇到的adjust_text标注文本覆盖误差棒和数据连线的问题,我来帮你梳理下问题根源和可行的解决方案:

问题根源定位

你后来发现问题出在使用scienceplots绘图风格上,这确实是关键——该风格会修改Matplotlib的默认绘图配置(比如元素层级、线条样式等),导致你之前传入objects参数的避让逻辑没有完全生效。另外,你之前的代码只添加了误差棒的线段边界框,漏掉了数据连线的避让处理,这也是文本会覆盖连线的原因之一。

修正后的解决方案

我们需要把数据连线、误差棒的所有线段都加入到adjust_text的避让对象列表中,同时适配scienceplots风格的特性。以下是调整后的完整代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import scienceplots  # type: ignore
from adjustText import adjust_text

plt.style.use(["science", "notebook"])

fig, ax = plt.subplots()

x = np.linspace(0, 1, 50) * np.pi
y = np.sin(x)

# 保存误差棒容器,方便后续获取所有绘图元素
errbar_container = ax.errorbar(x, y, xerr=0.25, yerr=0.05)

texts = []
for idx in range(0, len(x), 2):
    texts.append(
        ax.annotate(
            idx,
            xy=(x[idx], y[idx]),
            size="large",
            zorder=100,
        )
    )

# 准备所有需要避让的绘图元素边界框
avoid_objects = []
# 添加数据连线的边界框
avoid_objects.append(mpl.transforms.Bbox.from_path(errbar_container.lines[0].get_path()))
# 添加y方向误差棒的线段边界框
for seg in errbar_container.lines[-1][0].get_segments():
    avoid_objects.append(mpl.transforms.Bbox(seg))
for seg in errbar_container.lines[-1][1].get_segments():
    avoid_objects.append(mpl.transforms.Bbox(seg))
# 添加x方向误差棒的线段边界框(如果需要的话)
for seg in errbar_container.lines[-2][0].get_segments():
    avoid_objects.append(mpl.transforms.Bbox(seg))
for seg in errbar_container.lines[-2][1].get_segments():
    avoid_objects.append(mpl.transforms.Bbox(seg))

adjust_text(
    texts,
    x=x,
    y=y,
    expand=(2, 2),  # 增大文本与避让对象的距离
    objects=avoid_objects,
    arrowprops=dict(arrowstyle="->", color="red"),
    # 你之前尝试的参数现在应该可以生效了,比如限制只在x方向移动
    # only_move={'points': 'x', 'text': 'x'}
)

plt.show()

额外优化建议

  • 关于你之前尝试的autoalign和only_move参数,现在当objects列表完整后,这些参数应该可以正常生效了。比如设置only_move={'points': 'y', 'text': 'y'}可以限制文本只在y轴方向调整位置,避免打乱x轴的对应关系。
  • 如果scienceplots风格还是有干扰,可以先临时注释掉风格设置,确认核心避让逻辑正常后,再尝试调整风格的参数(比如修改zorder层级)来适配。

示例效果图

标注避让误差棒和连线的示例图

另外,这个问题也在adjustText项目的官方议题中被讨论过,你可以参考项目内的相关讨论来获取更多适配思路。

备注:内容来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:53:10