LoginSignup
0
1

More than 3 years have passed since last update.

「日程くん」のデータから戦績表をmatplotlibで作成してみる

Last updated at Posted at 2020-01-27

概要

表形式で対戦予定や結果(〇、△、●)を可視化したものを戦績表といいます。ただこれだけじゃ何って感じなので、実際のグラフィックをお見せします。
C8A6DC2D-1EFE-4B01-8F2E-D63AE36B7596.JPG

この表の見方は、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"]

キャプチャ0.PNG
まだ、開幕していませんので「スコア・入場者数・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"]

1 チーム単位にそれぞれの対戦相手と節と結果を抽出する
キャプチャ1.PNG

2 取得したデータのindexをリセットする
キャプチャ2.PNG

3 抽出条件のチーム分をsec:99で追加する
キャプチャ3.PNG

4 北からチーム順序データを追加する
キャプチャ4.PNG

5 北からチームに並び替える
6 最終形のデータフレームの行(抽出条件のチーム)に展開する。
キャプチャ8.PNG

これがデータの最終形です。これをグラフに描画します。

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」の場合は四角形でグレーの網掛けを描く

J1fixturetable_noemblem_2020.png

2019年の戦績表

※ただしこの表は、X軸がホームチーム、Y軸がアウェイチームです。(いまさら、間違いに気付く)
J1fixturetable_noemblem.png

残課題

  • 冒頭のブンデスリーガと同様にチームロゴをX軸、Y軸に配置して描画したかったが、大幅にずれて描画されたのでチーム名の文字列変更した。
  • チーム名がグリッドの中央からグリッド間の中央に変更したいが方法が分からなかった。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1