概要
表形式で対戦予定や結果(〇、△、●)を可視化したものを戦績表といいます。ただこれだけじゃ何って感じなので、実際のグラフィックをお見せします。
この表の見方は、X軸がアウェイで対戦する相手、Y軸がホームで対戦する相手を示しています。
このような表を「日程くん」のデータから、matplotlib
を使って作成します。定番の可視化手法からすれば大きく外れますが、こんなこともできる一例です。
元になるデータ
データ加工
fixturetable.py
game_result = pd.read_csv("../csv/game_result_all_2020_v2.csv", encoding="utf-8")
# J1のチーム名リスト(北から)2020年版
team = ["札幌","仙台","鹿島","浦和","柏","FC東京","川崎F","横浜FM","横浜FC","湘南",
"清水","名古屋","G大阪","C大阪","神戸","広島","鳥栖","大分"]
# J1のみ抽出し新しいデータフレーム作成
game_J1_tmp = game_result[game_result["大会"] == "J1"]
まだ、開幕していませんので「スコア・入場者数・home_g・away_g・結果」にはデータがありません。今回の表には関係ないので無視して結構です。
fixturetable.py
# 結合元の空データフレーム作成
game_J1 = pd.DataFrame(index=team, columns=team)
for i, t in enumerate(team):
# [1]チーム単位にそれぞれの対戦相手と節と結果を抽出する
team_tmp = game_J1_tmp.loc[game_J1_tmp["ホーム"] == t, ["アウェイ", "sec", "結果"]]
# [2]取得したデータのindexをリセットする
team_tmp.reset_index(inplace=True, drop=True)
# [3]抽出条件のチーム分をsec:99で追加する
team_tmp.loc[17,:] = [t, 99, -1]
# [4]北からチーム順序データを追加する
team_tmp["order"] = team_tmp["アウェイ"].apply(lambda x: team.index(x) if x in team else -1)
# [5]北からチームに並び替える
team_tmp = team_tmp.sort_values("order")
# [6]最終形のデータフレームの行(抽出条件のチーム)に展開する。
for x in range(len(team_tmp)):
game_J1.iloc[i, x] = team_tmp.at[team_tmp.index[x],"sec"]
5 北からチームに並び替える
6 最終形のデータフレームの行(抽出条件のチーム)に展開する。
これがデータの最終形です。これをグラフに描画します。
fixturetable.py
plt.rcParams["font.family"] = "IPAexGothic"
fig = plt.figure(figsize=(6,6),dpi=144)
ax1 = fig.add_subplot(111)
teams = np.arange(len(team)+1)
h, v = 0.5, 0.5
ax1.set_ylim(18, 0)
ax1.set_xticks(teams)
ax1.set_yticks(teams)
ax1.xaxis.tick_top()
ax1.set_xticklabels(team, rotation=90)
ax1.set_yticklabels(team)
ax1.grid(True)
ax1.tick_params(axis="both", which="both", length=0)
# 開催節の表示と対戦のないマスの着色
for k, t in enumerate(team):
for i in range(18):
if game_J1.at[game_J1.index[i], t] == 99:
_ = patches.Rectangle(xy=(k, i), width=1.0, height=1.0, color="0.8")
ax1.add_patch(_)
else:
ax1.text(k+h, i+v, game_J1.at[game_J1.index[i], t], size=12, color = "k", ha="center", va="center")
ax1.set_title("2020明治安田生命J1リーグ戦績表", fontsize=16)
txt = "引用元:JLeague Data Site"
fig.text(.9, .1, txt, fontsize=10, horizontalalignment="right")
txt3 = str(update) + "更新"
fig.text(.9, .95, txt3, fontsize=10, horizontalalignment="right")
# fig.tight_layout()
plt.savefig("../img/J1fixturetable_noemblem_2020.png", bbox_inches="tight")
グラフ作成のポイントは簡単で
- グリッドを表示する
- その中に節数をテキストで描く
- 節数が「99」の場合は四角形でグレーの網掛けを描く

2019年の戦績表
※ただしこの表は、X軸がホームチーム、Y軸がアウェイチームです。(いまさら、間違いに気付く)
残課題
- 冒頭のブンデスリーガと同様にチームロゴをX軸、Y軸に配置して描画したかったが、大幅にずれて描画されたのでチーム名の文字列変更した。
- チーム名がグリッドの中央からグリッド間の中央に変更したいが方法が分からなかった。