如何制作两个分组列的组合直方图,按各球队叠加主客场得分分布
需求说明
我手头有英超赛事数据集,想要为每支球队分别叠加绘制主场、客场的得分直方图,目前已经可以单独生成主客场的直方图,对应代码如下,但需要将同一只球队的两个直方图合并展示在同一坐标系下。
单独绘制客场得分直方图的代码:
df_EPL['Away_score'].hist(by=df_EPL['AwayTeam'],figsize = (8,8),color = '#96ddff');
单独绘制主场得分直方图的代码:
df_EPL['Home_score'].hist(by=df_EPL['HomeTeam'],figsize = (8,8),color = '#82c065');
实现方案(新手友好版)
我们可以先取出所有球队的唯一值,循环遍历每支球队分别筛选主客场得分,叠加绘制即可:
import matplotlib.pyplot as plt import math # 取出所有球队的去重列表 teams = sorted(df_EPL['HomeTeam'].unique()) team_total = len(teams) # 按球队总数调整画布行列参数,20支球队建议设4列、5行 cols = 4 rows = math.ceil(team_total / cols) # 初始化网格画布 fig, axes = plt.subplots(rows, cols, figsize=(16, 16)) axes = axes.flatten() # 把二维坐标轴数组转成一维方便遍历 for idx, team in enumerate(teams): ax = axes[idx] # 筛选当前球队的主客场得分 home_scores = df_EPL[df_EPL['HomeTeam'] == team]['Home_score'] away_scores = df_EPL[df_EPL['AwayTeam'] == team]['Away_score'] # 叠加绘制两个直方图 ax.hist(home_scores, color='#82c065', alpha=0.6, label='主场得分') ax.hist(away_scores, color='#96ddff', alpha=0.6, label='客场得分') ax.set_title(f'{team}得分分布') ax.legend() # 隐藏多余的空白子图 for idx in range(team_total, len(axes)): axes[idx].axis('off') plt.tight_layout() plt.show()
alpha参数用来设置直方图的透明度,建议设置为0.5~0.7区间,避免两个直方图互相遮挡,更方便对比分布差异- 如果需要固定得分区间对齐,可以给
hist方法加bins参数,例如bins=range(0, 8),让主客场的柱子区间完全一致
内容的提问来源于stack exchange,提问作者ahnnni
相关产品推荐
相关产品推荐

