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

Python中plt.text标注重叠,adjust_text无效如何修复?

解决Matplotlib中adjust_text标注重叠问题

你当前代码的问题在于分别对两组文本调用adjust_text,导致两组标注之间不会互相避让,仅在组内调整位置,因此仍会出现跨组重叠。

修改方案

把两组曲线的所有标注文本收集到同一个列表中,一次性调用adjust_text,让所有标注整体优化位置、互相避让。同时注意处理DataFrame返回的二维数值结构,避免传入数组而非标量值。

修改后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from adjustText import adjust_text

# 假设pr和pr1000已提前定义
freq = pd.DataFrame(np.average(pr, axis=0), index=pr.columns) 
freq1000 = pd.DataFrame(np.average(pr1000, axis=0), index=pr1000.columns)    

plt.plot(freq, label='n=500')
plt.plot(freq1000, label='n=1000')
plt.legend(loc='best')

plt.xlabel('x')
plt.ylabel('y')
plt.title('curve high vs low,gtype{}'.format(type_))

texts = []
# 处理n=500的标注,将二维values转为标量
for x, y in zip(freq.index, freq.values.flatten()):
    texts.append(plt.text(x, y, '%.3f' % y, color='blue'))  # 用颜色区分两组标注

# 处理n=1000的标注,同样转y为标量
for x, y in zip(freq1000.index, freq1000.values.flatten()):
    texts.append(plt.text(x, y, '%.3f' % y, color='orange'))

# 一次性调整所有标注,实现跨组避让
adjust_text(
    texts,
    only_move={'points': 'y', 'texts': 'xy'},
    arrowprops=dict(arrowstyle="->", color='gray', lw=0.5),
    expand_points=(1.2, 1.2),  # 可选:扩大点的避让范围
    expand_text=(1.1, 1.1)     # 可选:扩大文本的避让范围
)

plt.show()

关键改动说明

  • 合并标注列表:将两组文本放入同一个texts列表,让adjust_text统一处理所有标注的位置,实现跨组互相避让。
  • 修正y值维度:用flatten()把DataFrame返回的二维values转为一维标量,避免因传入数组导致的位置错误。
  • 可选优化:给两组标注设置不同颜色,方便区分曲线与对应标注;通过expand_points和expand_text参数扩大避让范围,进一步降低重叠概率。

内容的提问来源于stack exchange,提问作者ExcitedSnail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:02