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

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()

关键调整说明

  1. 指定避开对象:通过x和y参数传入散点坐标,让adjust_text明确需要避开的元素,避免标签被移至无关区域。
  2. 添加箭头:arrowprops配置箭头,让标签与原始标注位置保持关联,可读性更强。
  3. 优化布局参数:
    • expand_points:扩大标签与散点的安全距离
    • force_text/force_objects:调整标签间、标签与散点间的排斥力度,平衡布局与可读性
  4. 可选限制移动方向:only_move参数可限制标签仅在特定方向移动,防止过度偏离原位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:45:56