如何在Matplotlib绘制的年度进球条形图上添加每名球员的均值水平线
实现代码
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('https://raw.githubusercontent.com/verticale3185/FINEL-PROJECT/main/cristiano_vs_messi.csv') df.date = pd.to_datetime(df.date) df['year'] = pd.DatetimeIndex(df['date']).year df['year'].fillna(method = 'ffill', inplace = True) df['year'] = df['year'].astype(int) messi_df = df.loc[df.player == 'messi'].reset_index() ronaldo_df = df.loc[df.player == 'ronaldo'] # 计算两人年度进球序列与年均值 ronaldo_yearly_goals = ronaldo_df.groupby(['year'])['player'].count().astype(int) messi_yearly_goals = messi_df.groupby(['year'])['player'].count().astype(int) ronaldo_avg = ronaldo_yearly_goals.mean() messi_avg = messi_yearly_goals.mean() plt.suptitle('Goals Per Year For Every Player') # 绑定同一绘图轴,调整position参数避免条形重叠 ax = ronaldo_yearly_goals.plot(kind='bar',color='brown',label='Ronaldo',figsize=(15,5),width = 0.4, position=1) messi_yearly_goals.plot(kind='bar',color='#14D622',label='Messi',figsize=(15,5),width = 0.2, position=0, ax=ax) # 绘制同色均值参考线,标注数值 plt.axhline(y=ronaldo_avg, color='brown', linestyle='--', label=f'Ronaldo 年均进球: {round(ronaldo_avg,1)}') plt.axhline(y=messi_avg, color='#14D622', linestyle='--', label=f'Messi 年均进球: {round(messi_avg,1)}') plt.legend() plt.show()
关键修改说明
- 预计算两名球员的年度进球序列和均值,避免重复分组运算
- 绑定同一绘图轴,调整
position参数解决两组条形重叠问题 - 使用
plt.axhline绘制水平参考线,颜色与对应球员条形保持一致,采用虚线样式区分,标签直接展示均值数值 - 修正原标题拼写错误(将
Fvery改为Every)
内容的提问来源于stack exchange,提问作者Or Nir
相关产品推荐
相关产品推荐

