使用DataFrame绘制散点图时图例仅显示首个项的问题求助
解决Pandas散点图图例仅显示第一个标签的问题
问题原因
你用df1.plot(kind='scatter')时,Pandas会把所有数据点当作单个绘图系列处理。当你给plt.legend()传入10个标签时,只有第一个标签能匹配这个单一系列,剩余标签没有对应的绘图对象,因此不会显示在图例中。
解决方法
推荐用Matplotlib原生的scatter函数,循环绘制每个球队的数据点,让每个球队对应独立的绘图系列,这样图例就能正常显示所有标签。
假设你的CSV文件里有一列名为Team(存储球队名称),修改后的代码如下:
import pandas as pd import matplotlib.pyplot as plt df1 = pd.read_csv(r'F:\anoch\IPproject\FSTS\teams.csv') # 定义球队列表和对应颜色 teams = ['Manchester City','Bayern Muchen','Real Madrid','Internazionale','Liverpool','Arsenal','FC Barcelona','Atletico Madrid','PSG','RB Leipzig'] colors = ['red', 'green', 'blue', 'yellow','black','purple','aquamarine','grey','tan','khaki'] # 逐个绘制每个球队的散点 for team, color in zip(teams, colors): # 筛选当前球队的数据 team_data = df1[df1['Team'] == team] plt.scatter(team_data['GOALS/90min'], team_data['xG'], color=color, label=team) # 设置图例和坐标轴标签 plt.legend(bbox_to_anchor=(-0.1, 0.75)) plt.xlabel('GOALS/90min') plt.ylabel('xG') plt.show()
补充说明
如果你的CSV每行对应一个球队,且没有单独的Team列,也可以直接按索引循环取数据:
for idx, (team, color) in enumerate(zip(teams, colors)): row = df1.iloc[idx] plt.scatter(row['GOALS/90min'], row['xG'], color=color, label=team)
内容的提问来源于stack exchange,提问作者Sindhu Saju
相关产品推荐
相关产品推荐

