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

AdjustText库无法调整Matplotlib散点图文本标签位置求助

问题解决:adjusttext仅作用于单个标签的原因及修复

核心问题分析

你的代码里,texts变量在for循环内部被反复重新赋值,每次循环都会覆盖之前的内容。循环结束后,texts只保留了最后一个玩家的文本标签,这就是为什么print出来只有一个对象,且adjusttext没有效果——它只调整了这一个标签的位置,自然看不出变化。

另外,groupby('Player')后,每个分组内的Player列值都是同一个玩家名,你用enumerate(group['Player'])会给同一个玩家多次添加重复标签,这也是冗余的。

修复后的代码

from adjustText import adjust_text
import matplotlib.pyplot as plt

# 定义过滤条件
min_scaled_rank = 0
max_scaled_rank = 5
min_back_win = 1.0
max_back_win = 200

# 过滤数据
filtered_data = df_nonzero[(df_nonzero['Scaled Rating'] >= min_scaled_rank) & 
                           (df_nonzero['Scaled Rating'] <= max_scaled_rank) & 
                           (df_nonzero['Back Win'] >= min_back_win) & 
                           (df_nonzero['Back Win'] <= max_back_win)]

# 初始化空列表存储所有文本标签
texts = []
groups = filtered_data.groupby('Player')
fig, ax = plt.subplots(figsize=(10, 8))

for name, group in groups:
    ax.scatter(group['Scaled Rating'], group['Back Win'])
    # 每个玩家仅添加一次标签,取分组内第一个数据点的位置
    text = ax.text(group['Scaled Rating'].iloc[0], 
                   group['Back Win'].iloc[0], 
                   name)
    texts.append(text)

# 调整所有文本标签的位置
adjust_text(texts, force_text=0.5, expand=(1.5, 1.5))

# 设置图表标签和标题
ax.set_xlabel('Scaled Rating')
ax.set_ylabel('Back Win')
ax.set_title('Back Win vs Weighted Rank')

plt.show()

关键修改点

  • 提前初始化texts列表:把texts = []放在for循环外面,避免每次循环覆盖变量。
  • 单个玩家仅添加一次标签:利用分组后的玩家名name,直接给每个玩家的第一个数据点添加标签,避免重复创建相同文本对象。
  • 用append收集所有标签:循环中每次创建的文本对象都添加到texts列表,确保adjusttext能作用于所有玩家标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:50:43