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

如何解决使用plt.annotate批量标注数据点时的文本重叠问题

解决Matplotlib标注文本重叠的问题

嘿,标注重叠确实太影响读图效率了!我帮你整理了几个实用的解决办法,亲测好用:

方法1:用adjustText库自动调整(最推荐)

这是专门解决文本重叠问题的工具,能自动计算每个标注的最优位置,还能添加箭头连接数据点和标注,可读性拉满。

首先安装库:

pip install adjustText

然后修改你的代码:

import matplotlib.pyplot as plt
import seaborn as sns
from adjustText import adjust_text

plt.figure(figsize = (12,8))
sns.regplot(data = plot_data, x = x, y = y, ci = False, truncate = False)

# 筛选需要标注的索引
idx = plot_data[(plot_data[x] > 2) | (plot_data[y] > 2)].index
texts = []

# 先收集所有标注对象
for i in idx:
    txt = plt.annotate(
        text = fc_data_comb["PG.Genes"][i], 
        xy = (fc_data_comb[x][i], fc_data_comb[y][i]), 
        xytext = (10, 10),  # 初始偏移量,可按需调整
        textcoords='offset points'
    )
    texts.append(txt)

# 关键一步:自动调整所有标注的位置,避免重叠
adjust_text(texts, arrowprops=dict(arrowstyle='->', color='gray'))

plt.show()

方法2:手动调整偏移与角度(适合小数据集)

如果你的数据点数量不多,可以手动给每个标注设置不同的偏移或旋转角度,避免重叠:

plt.figure(figsize = (12,8))
sns.regplot(data = plot_data, x = x, y = y, ci = False, truncate = False)

idx = plot_data[(plot_data[x] > 2) | (plot_data[y] > 2)].index

for i in idx:
    # 交替设置左右/上下偏移,避免挤在一起
    offset_x = 15 * (-1)**i
    offset_y = 15 * (-1)**(i+1)
    plt.annotate(
        text = fc_data_comb["PG.Genes"][i], 
        xy = (fc_data_comb[x][i], fc_data_comb[y][i]), 
        xytext = (offset_x, offset_y), 
        textcoords='offset points',
        rotation=30  # 旋转文本,减少横向空间占用
    )

plt.show()

方法3:长文本换行减少占用空间

如果你的标注文本比较长,可以用textwrap把文本拆分成多行,缩小单条标注的占用空间:

import matplotlib.pyplot as plt
import seaborn as sns
import textwrap

plt.figure(figsize = (12,8))
sns.regplot(data = plot_data, x = x, y = y, ci = False, truncate = False)

idx = plot_data[(plot_data[x] > 2) | (plot_data[y] > 2)].index

for i in idx:
    # 把长文本拆成每行最多10个字符
    wrapped_text = textwrap.fill(fc_data_comb["PG.Genes"][i], width=10)
    plt.annotate(
        text = wrapped_text, 
        xy = (fc_data_comb[x][i], fc_data_comb[y][i]), 
        xytext = (10, 10), 
        textcoords='offset points'
    )

plt.show()

总体来说,adjustText是最省心的方案,自动化程度高,适合大多数场景;如果是小数据集,手动调整更灵活;长文本的话可以结合换行和自动调整一起使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:22:38