Python3中adjust_text调整文本异常,如何修复重叠标签?
解决Matplotlib散点图文本标签重叠及adjust_text失效问题
问题描述
使用Matplotlib绘制散点图时,手动添加的文本标签出现严重重叠;尝试用adjust_text调整后,标签被集体移至左下角,完全失去标注作用。
原始重叠代码:
import matplotlib.pyplot as plt from adjustText import adjust_text x = [12,471,336,1300] y = [2,5,4,11] z = [0.1,0.2,0.3,0.4] im = plt.scatter(x, y, c = z, cmap = "gist_rainbow", alpha = 0.5) plt.colorbar(im) texts = [] texts.append(plt.text(783, 7.62372448979592, 'TRL1')) texts.append(plt.text(601, 6.05813953488372, 'CFT1')) texts.append(plt.text(631, 4.28164556962025, 'PTR3')) texts.append(plt.text(665, 7.68018018018018, 'STT4')) texts.append(plt.text(607, 5.45888157894737, 'RSC9')) texts.append(plt.text(914, 4.23497267759563, 'DOP1')) texts.append(plt.text(612, 7.55138662316476, 'SEC8')) texts.append(plt.text(766, 4.1264667535854, 'ATG1')) texts.append(plt.text(681, 3.80205278592375, 'TFC3')) plt.show()
添加adjust_text后失效的代码:
import matplotlib.pyplot as plt from adjustText import adjust_text x = [12,471,336,1300] y = [2,5,4,11] z = [0.1,0.2,0.3,0.4] im = plt.scatter(x, y, c = z, cmap = "gist_rainbow", alpha = 0.5) plt.colorbar(im) data = [ (783, 7.62372448979592, 'TRL1'), (601, 6.05813953488372, 'CFT1'), (631, 4.28164556962025, 'PTR3'), (665, 7.68018018018018, 'STT4'), (607, 5.45888157894737, 'RSC9'), (914, 4.23497267759563, 'DOP1'), (612, 7.55138662316476, 'SEC8'), (766, 4.1264667535854, 'ATG1'), (681, 3.80205278592375, 'TFC3') ] texts = [plt.text(x, y, l) for x, y, l in data] adjust_text(texts) plt.savefig('adjust.text.png', bbox_inches='tight', pad_inches = 0.1)
解决方案
问题核心是adjust_text默认不知道需要避开散点元素,导致算法将标签移至空白角落。需明确指定要避开的散点,并调整参数优化布局:
修正后的代码
import matplotlib.pyplot as plt from adjustText import adjust_text # 散点数据 x_scatter = [12, 471, 336, 1300] y_scatter = [2, 5, 4, 11] z = [0.1, 0.2, 0.3, 0.4] im = plt.scatter(x_scatter, y_scatter, c=z, cmap="gist_rainbow", alpha=0.5) plt.colorbar(im) # 标签数据 data = [ (783, 7.62372448979592, 'TRL1'), (601, 6.05813953488372, 'CFT1'), (631, 4.28164556962025, 'PTR3'), (665, 7.68018018018018, 'STT4'), (607, 5.45888157894737, 'RSC9'), (914, 4.23497267759563, 'DOP1'), (612, 7.55138662316476, 'SEC8'), (766, 4.1264667535854, 'ATG1'), (681, 3.80205278592375, 'TFC3') ] texts = [plt.text(x, y, l) for x, y, l in data] # 关键配置:指定避开的散点,添加箭头,调整排斥力与距离 adjust_text( texts, x=x_scatter, y=y_scatter, arrowprops=dict(arrowstyle="-", color='gray', lw=0.5), # 添加箭头关联原位置 expand_points=(1.2, 1.2), # 增大标签与散点的间距 force_text=0.8, # 增强标签间的排斥力,避免重叠 force_objects=0.6, # 增强标签与散点的排斥力 only_move={'points':'y', 'text':'y'} # 可选:限制移动方向,避免过度偏移 ) plt.savefig('adjust.text.png', bbox_inches='tight', pad_inches=0.1) plt.show()
关键调整说明
- 指定避开对象:通过
x和y参数传入散点坐标,让adjust_text明确需要避开的元素,避免标签被移至无关区域。 - 添加箭头:
arrowprops配置箭头,让标签与原始标注位置保持关联,可读性更强。 - 优化布局参数:
expand_points:扩大标签与散点的安全距离force_text/force_objects:调整标签间、标签与散点间的排斥力度,平衡布局与可读性
- 可选限制移动方向:
only_move参数可限制标签仅在特定方向移动,防止过度偏离原位置。
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

