plt.step绘图问题:多余线条与起始位置偏移
问题修复:球队排名折线图的两个Bug解决
问题1:莫名出现的紫色贯穿线条
原因:plt.step的参数传递错误。你当前把zip生成的坐标对列表直接传给plt.step,这不符合该函数的参数要求——它需要分别传入独立的x轴数组和y轴数组,而非合并的坐标对。错误的参数格式让matplotlib解析出额外的默认紫色线条。
问题2:线条从x=0起始,与散点错位
原因:plt.step默认使用where='pre'模式,会在第一个x值(1)之前就开始绘制线条,导致起始点落到x=0位置。同时配合前面的参数错误,进一步放大了对齐偏差。
修复后的完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.DataFrame([['Team1', 1, 1], ['Team1', 2, 2], ['Team1', 1, 3], ['Team1', 5, 4], ['Team1', 1, 5], ['Team2', 2, 1], ['Team2', 3, 2], ['Team2', 4, 3], ['Team2', 4, 4], ['Team2', 3, 5], ['Team3', 3, 1], ['Team3', 4, 2], ['Team3', 3, 3], ['Team3', 2, 4], ['Team3', 2, 5] ], columns=['Team', 'Position', 'Game_week']) teams = df['Team'].unique() fig, ax = plt.subplots() # 标签与坐标轴设置 plt.xlabel('Game weeks') plt.ylabel('Positions') plt.xlim(-0.2, 5.2) plt.ylim(0.8, 5.2) plt.gca().invert_yaxis() # 刻度设置 xi = list(np.unique(df['Game_week'])) yi = list(np.unique(df['Position'])) plt.xticks(xi) plt.yticks(yi) # 球队颜色(调整Team3颜色避免和Team2重复) colors = {'Team1': 'tab:red', 'Team2': 'tab:blue', 'Team3': 'tab:green'} # 绘制散点 plt.scatter(df['Game_week'], df['Position'], s=45, c=df['Team'].map(colors), zorder=2) # 绘制球队折线(修复核心部分) for team, team_data in df.groupby('Team', sort=False): # 分别传入x和y数组,设置where='post'让线条从x=1开始对齐散点 plt.step(team_data['Game_week'], team_data['Position'], '-', color=colors[team], linewidth=8, alpha=0.2, zorder=1, where='post') plt.show() plt.close()
关键修改点
- 把
plt.step的参数从合并的坐标对,改成分别传入team_data['Game_week']和team_data['Position'] - 添加
where='post'参数,让折线在每个Game_week的位置才开始绘制,与散点完全对齐 - 调整了Team3的颜色为
tab:green,方便区分不同球队的线条
内容的提问来源于stack exchange,提问作者muted_buddy
相关产品推荐
相关产品推荐

