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

