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
相关产品推荐
相关产品推荐

