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

## 概要
表形式で対戦予定や結果（〇、△、●）を可視化したものを戦績表といいます。ただこれだけじゃ何って感じなので、実際のグラフィックをお見せします。
![C8A6DC2D-1EFE-4B01-8F2E-D63AE36B7596.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/b422b78e-aa6c-19a1-17a5-6de06dd83463.jpeg)

* [ブンデスリーガ 日本語版(Twitter:@Bundesliga_JP)から引用](https://twitter.com/Bundesliga_JP?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor)

この表の見方は、X軸がアウェイで対戦する相手、Y軸がホームで対戦する相手を示しています。
このような表を「日程くん」のデータから、`matplotlib`を使って作成します。定番の可視化手法からすれば大きく外れますが、こんなこともできる一例です。

## 元になるデータ
* [「日程くん」の結果をスクレイピングする](https://qiita.com/r_beginners/items/0d9608f86cdf82907074)

## データ加工

```fixturetable.py
game_result = pd.read_csv("../csv/game_result_all_2020_v2.csv", encoding="utf-8")
# J1のチーム名リスト（北から）2020年版
team = ["札幌","仙台","鹿島","浦和","柏","FC東京","川崎Ｆ","横浜FM","横浜FC","湘南",
        "清水","名古屋","Ｇ大阪","Ｃ大阪","神戸","広島","鳥栖","大分"]
# J1のみ抽出し新しいデータフレーム作成
game_J1_tmp = game_result[game_result["大会"] == "Ｊ１"]
```
![キャプチャ0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/0ebad0ea-a3b4-d274-134d-99f178a2500d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/4f2315c9-0a2e-5a90-9c9d-2eba285cad31.png)

2 取得したデータのindexをリセットする
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/703c5d17-fc80-fb98-57fc-a1c2418c43c9.png)

3 抽出条件のチーム分をsec:99で追加する
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/1b4a2224-801b-fbd4-7a39-5554797a6075.png)

4 北からチーム順序データを追加する
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/30d9a4c9-417f-c310-b370-02afecc5a932.png)

5 北からチームに並び替える
6 最終形のデータフレームの行（抽出条件のチーム）に展開する。
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/8f5fcd58-cbb5-45c4-0d6a-b8747e8b38eb.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明治安田生命Ｊ１リーグ戦績表", 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」の場合は四角形でグレーの網掛けを描く

<img width="387" alt="J1fixturetable_noemblem_2020.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/92a5f454-5956-b1ed-a923-4eae62d69edb.png">

## 2019年の戦績表
※ただしこの表は、X軸がホームチーム、Y軸がアウェイチームです。（いまさら、間違いに気付く）
<img width="387" alt="J1fixturetable_noemblem.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126042/dec9ab0d-aa45-584e-0090-3fc72a44c953.png">


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