菊池投手・投球結果をヒートマップにする

投球コースのヒートマップを作成する

今回は、菊池雄星投手で試しに実施

2022、2023の投球結果を比較する

***

# 菊池雄星投手のピッチングデータを取得

このコードは、菊池雄星（プレイヤーID: 579328）のピッチングデータを取得し、一つのデータフレームにまとめるものです。Pythonのライブラリpybaseballを使って、指定された日付のピッチングデータを取得しています。

<pre><code class>!pip install pybaseball
from pybaseball import statcast
import pandas as pd
dates = [
    '2023-04-04', '2023-04-09', '2023-04-15', '2023-04-21', '2023-04-26', '2023-05-02',
    '2022-04-12', '2022-04-19', '2022-04-24', '2022-04-29', '2022-05-04', '2022-05-10',
    '2022-05-16', '2022-05-22', '2022-05-28', '2022-06-03', '2022-06-08', '2022-06-14',
    '2022-06-19', '2022-06-25', '2022-06-30', '2022-07-05', '2022-07-28', '2022-08-03',
    '2022-08-08', '2022-08-15', '2022-08-18', '2022-08-23', '2022-08-26', '2022-08-28',
    '2022-09-03', '2022-09-06', '2022-09-11', '2022-09-16', '2022-09-25', '2022-09-28',
    '2022-09-30', '2022-10-05'
]

# Create an empty DataFrame to store the data
df_579328_all_dates = pd.DataFrame()

# Fetch data for each date and concatenate
for date in dates:
    df_single_day = statcast(start_dt=date, end_dt=date)
    df_579328_single_day = df_single_day[df_single_day['pitcher'] == 579328]
    df_579328_all_dates = pd.concat([df_579328_all_dates, df_579328_single_day])

# Reset the index of the final DataFrame
df_579328_all_dates.reset_index(drop=True, inplace=True)
</code></pre>

***

# 使用された球種

このコードは、先程まとめた菊池雄星のピッチングデータ（df\_579328\_all_dates）から、投球結果を抽出し、使用された球種を調べて表示しています。

<pre><code class># 投球結果を抽出
df_579328 = df_579328_all_dates

# df_579328のpitch_typeカラムに含まれるユニークな球種を確認する
unique_pitch_types = df_579328['pitch_type'].unique()

# 確認した球種を表示する
print(unique_pitch_types)

</code></pre>

結果、

<pre><code class>['SL' 'FF' 'CH' 'CU' 'FC']
</code></pre>

*   FF - 4-seam ストレート
*   CU - カーブ
*   SL - スライダー
*   FC - カッター
*   CH - チェンジアップ

***

# 左打者と右打者に対する球種の使用球数

このコードでは、菊池雄星の投球データから、各年ごとに左打者と右打者に対する球種の使用回数を集計し、表示しています。

<pre><code class>import pandas as pd

def pitch_counts(df):
    # 左打者と右打者に対する投球データを抽出
    df_L = df[df['stand'] == 'L']
    df_R = df[df['stand'] == 'R']

    # 各カテゴリーでの球種の出現回数をカウント
    total_counts = df['pitch_type'].value_counts()
    left_counts = df_L['pitch_type'].value_counts()
    right_counts = df_R['pitch_type'].value_counts()

    # 出現回数をデータフレームにまとめる
    pitch_counts_table = pd.DataFrame({'Total': total_counts, 'Left Batter': left_counts, 'Right Batter': right_counts})

    # NaNを0に置き換える
    pitch_counts_table.fillna(0, inplace=True)

    # カウントを整数に変換する
    pitch_counts_table = pitch_counts_table.astype(int)

    return pitch_counts_table

# 続けて、球種カウントのコードを実行します。
# Split the data by year
df_2022= df_579328_all_dates[df_579328_all_dates['game_year'] == 2022]
df_2023 = df_579328_all_dates[df_579328_all_dates['game_year'] == 2023]

# Get pitch counts for each year
pitch_counts_2022 = pitch_counts(df_2022)
pitch_counts_2023 = pitch_counts(df_2023)

# Display the results
print("\n2022年の球種カウント:")
print(pitch_counts_2022)
print("\n2023年の球種カウント:")
print(pitch_counts_2023)

</code></pre>

結果、

![](https://pbs.twimg.com/media/FvXfAekagAAuudZ?format=png\&name=360x360)

***

# 左打者と右打者に対する球種の使用球数(円グラフ)

このコードは、菊池雄星の投球データをもとに、2022年と2023年の球種の使用割合を、全体・左打者・右打者別に円グラフで表示します。plot_pitch_distribution関数が実際のグラフ描画を行っています。

<pre><code class>import matplotlib.pyplot as plt

def plot_pitch_distribution(df, year):
    df_L = df[df['stand'] == 'L']
    df_R = df[df['stand'] == 'R']

    fig, axs = plt.subplots(1, 3, figsize=(18, 6))
    plt.suptitle(f'Pitch Distribution in {year}')

    colors = {'SL': 'purple', 'FF': 'blue', 'CH': 'green', 'CU': 'orange', 'FC': 'red'}

    def autopct_white(pct):
        return ('%.1f%%' % pct) if pct > 0 else ''

    # Total
    df['pitch_type'].value_counts().plot(kind='pie', ax=axs[0], autopct=autopct_white, textprops={'color': 'white'}, colors=[colors[key] for key in df['pitch_type'].value_counts().index], labels=None)
    axs[0].set_title('Total')
    axs[0].set_ylabel('')
    axs[0].legend(df['pitch_type'].value_counts().index, loc="best", bbox_to_anchor=(0.9, 0.2))

    # vs Left batter
    df_L['pitch_type'].value_counts().plot(kind='pie', ax=axs[1], autopct=autopct_white, textprops={'color': 'white'}, colors=[colors[key] for key in df_L['pitch_type'].value_counts().index], labels=None)
    axs[1].set_title('vs Left batter')
    axs[1].set_ylabel('')
    axs[1].legend(df_L['pitch_type'].value_counts().index, loc="best", bbox_to_anchor=(0.9, 0.2))

    # vs Right batter
    df_R['pitch_type'].value_counts().plot(kind='pie', ax=axs[2], autopct=autopct_white, textprops={'color': 'white'}, colors=[colors[key] for key in df_R['pitch_type'].value_counts().index], labels=None)
    axs[2].set_title('vs Right batter')
    axs[2].set_ylabel('')
    axs[2].legend(df_R['pitch_type'].value_counts().index, loc="best", bbox_to_anchor=(0.9, 0.2))

    plt.show()

# Plot pitch distribution for 2022, and 2023 data
plot_pitch_distribution(df_2022, 2022)
plot_pitch_distribution(df_2023, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FvXfkB5agAIZAcR?format=jpg\&name=large)
![](https://pbs.twimg.com/media/FvXflLkaQAAzc7h?format=jpg\&name=large)

***

# 球種別の投球コースを散布図で表示

このコードは、菊池雄星の投球データをもとに、2022年と2023年の球種別の投球位置を散布図で表示します。plot_pitch_location関数が実際のグラフ描画を行っています。

<pre><code class>import matplotlib.pyplot as plt

def plot_pitch_location(df, year):
    # データを pitch_type ごとにグループ分けする
    grouped = df.groupby('pitch_type')

    colors = {'SL': 'purple', 'FF': 'blue', 'CH': 'green', 'CU': 'orange', 'FC': 'red'}

    # pitch_type ごとに、'plate_x' を X 軸、'plate_z' を Y 軸とした散布図を作成する
    for pitch_type, data in grouped:
        plt.scatter(data['plate_x'], data['plate_z'], label=pitch_type, color=colors[pitch_type])

    # ストライクゾーン
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]
    plt.plot(x, y, linestyle='--', color='red')

    # 凡例を表示する
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

    plt.xlim(-3, 3)
    plt.ylim(-2, 6)

    plt.xlabel('Plate X')
    plt.ylabel('Plate Z')

    # 罫線
    plt.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    plt.title(f'Pitch Location in {year}')
    
    # グラフを表示する
    plt.show()

# 2021年、2022年、2023年のデータに対して投球位置をプロット
plot_pitch_location(df_2022, 2022)
plot_pitch_location(df_2023, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FvXfpn1aIAA5bzq?format=png\&name=small)
![](https://pbs.twimg.com/media/FvXfqiEagAEim5j?format=png\&name=small)

***

# 各年の球種別の投球コース並べて表示

このコードは、2022年と2023年の菊池雄星の投球データをもとに、各球種ごとに投球位置をプロットして比較できるように改良されたものです。plot_pitch_location関数が引数として2つのデータフレームと対応する年を取り、各年の球種別の投球位置を並べて表示します。

<pre><code class>import matplotlib.pyplot as plt

def plot_pitch_location(df1, df2, year1, year2):
    # データを pitch_type ごとにグループ分けする
    grouped1 = df1.groupby('pitch_type')
    grouped2 = df2.groupby('pitch_type')

    colors = {'SL': 'purple', 'FF': 'blue', 'CH': 'green', 'CU': 'orange', 'FC': 'red'}

    pitch_types = set(df1['pitch_type'].unique()).union(set(df2['pitch_type'].unique()))
    num_pitch_types = len(pitch_types)
    
    fig, axs = plt.subplots(num_pitch_types, 2, figsize=(10, 4 * num_pitch_types), constrained_layout=True)
    
    # ストライクゾーンの座標
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]
    
    for i, pitch_type in enumerate(pitch_types):
        data1 = grouped1.get_group(pitch_type) if pitch_type in grouped1.groups else None
        data2 = grouped2.get_group(pitch_type) if pitch_type in grouped2.groups else None

        # 2022
        if data1 is not None:
            axs[i, 0].scatter(data1['plate_x'], data1['plate_z'], label=pitch_type, color=colors[pitch_type])
            axs[i, 0].fill(x, y, color='r', alpha=0.3)
        axs[i, 0].set_xlim(-3, 3)
        axs[i, 0].set_ylim(-2, 6)
        axs[i, 0].set_xlabel('Plate X')
        axs[i, 0].set_ylabel('Plate Z')
        axs[i, 0].grid(which='both', linestyle='--', color='gray', alpha=0.5)
        axs[i, 0].set_title(f'{pitch_type} Pitch Location in {year1}')

        # 2023
        if data2 is not None:
            axs[i, 1].scatter(data2['plate_x'], data2['plate_z'], label=pitch_type, color=colors[pitch_type])
            axs[i, 1].fill(x, y, color='r', alpha=0.3)
        axs[i, 1].set_xlim(-3, 3)
        axs[i, 1].set_ylim(-2, 6)
        axs[i, 1].set_xlabel('Plate X')
        axs[i, 1].set_ylabel('Plate Z')
        axs[i, 1].grid(which='both', linestyle='--', color='gray', alpha=0.5)
        axs[i, 1].set_title(f'{pitch_type} Pitch Location in {year2}')

    # グラフを表示する
    plt.show()

# 2022年と2023年のデータに対して投球位置をプロット
plot_pitch_location(df_2022, df_2023, 2022, 2023)


</code></pre>

![](https://pbs.twimg.com/media/FvXftVjagAATjGW?format=png\&name=medium)

***

# 投球コースのヒートマップをプロットして比較1

このコードは、2022年と2023年の菊池雄星の投球データをもとに、指定された球種の投球位置のヒートマップをプロットして比較できるようになっています。ここでは、plot_pitch_location関数が2つのデータフレームと対応する年、および球種を引数に取り、各年の指定された球種の投球位置のヒートマップを並べて表示します。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2, pitch_type):
    fig, axs = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    if pitch_type in df1['pitch_type'].unique():
        data1 = df1[df1['pitch_type'] == pitch_type]
        sns.histplot(data=data1, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[0], binwidth=0.1)
        axs[0].set_title(f'{year1} {pitch_type}')
    else:
        axs[0].set_title(f'{year1} {pitch_type} (No data)')

    if pitch_type in df2['pitch_type'].unique():
        data2 = df2[df2['pitch_type'] == pitch_type]
        sns.histplot(data=data2, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[1], binwidth=0.1)
        axs[1].set_title(f'{year2} {pitch_type}')
    else:
        axs[1].set_title(f'{year2} {pitch_type} (No data)')

    plt.show()

plot_pitch_location(df_2022, df_2023, 2022, 2023, 'SL')

</code></pre>

![](https://pbs.twimg.com/media/FvXfwvoakAUgk_P?format=png\&name=large)

***

# 投球コースのヒートマップをプロットして比較2

このコードは、前回提供したコードにストライクゾーンの表示を追加したものです。ストライクゾーンを両方のヒートマップに重ねて表示することで、投球位置がストライクゾーン内にどれだけ集まっているかを視覚的に比較しやすくなります。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2, pitch_type):
    fig, axs = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    # ストライクゾーンの座標
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]

    if pitch_type in df1['pitch_type'].unique():
        data1 = df1[df1['pitch_type'] == pitch_type]
        sns.histplot(data=data1, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[0], binwidth=0.3)
        axs[0].plot(x, y, linestyle='--', color='black')
        axs[0].set_title(f'{year1} {pitch_type}')
    else:
        axs[0].set_title(f'{year1} {pitch_type} (No data)')

    if pitch_type in df2['pitch_type'].unique():
        data2 = df2[df2['pitch_type'] == pitch_type]
        sns.histplot(data=data2, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[1], binwidth=0.3)
        axs[1].plot(x, y, linestyle='--', color='black')
        axs[1].set_title(f'{year2} {pitch_type}')
    else:
        axs[1].set_title(f'{year2} {pitch_type} (No data)')

    plt.show()

plot_pitch_location(df_2022, df_2023, 2022, 2023, 'SL')

</code></pre>

![](https://pbs.twimg.com/media/FvXf33SaMAA13PZ?format=png\&name=small)

***

# 投球コースのヒートマップをプロットして比較3

このコードは、2022年と2023年の各ピッチタイプ（スライダー、フォーシーム・ファストボール、チェンジアップ、カーブ、カット・ファストボール）の投球位置のヒートマップを作成し、ストライクゾーンを表示します。ヒートマップは、投球位置の密度を色で表現し、ストライクゾーンは黒い破線で描かれます。これにより、各年の投球位置の分布やストライクゾーン内外での投球傾向を視覚的に把握することができます。

さらに、このコードでは、最大および最小座標を計算して、ヒートマップの表示範囲を調整しています。これにより、すべてのヒートマップが同じ座標範囲で表示され、比較が容易になります。

実行して表示されるヒートマップから、2022年と2023年の各ピッチタイプの投球位置の変化や傾向を比較することができます。投球位置がストライクゾーン内にどれだけ集まっているかや、外角・内角での投球の違いなどを観察することができます。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2, pitch_type, x_min, x_max, y_min, y_max):
    fig, axs = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    # ストライクゾーンの座標
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]

    if pitch_type in df1['pitch_type'].unique():
        data1 = df1[df1['pitch_type'] == pitch_type]
        sns.histplot(data=data1, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[0], binwidth=0.3)
        axs[0].plot(x, y, linestyle='--', color='black')
        axs[0].set_title(f'{year1} {pitch_type}')
    else:
        axs[0].set_title(f'{year1} {pitch_type} (No data)')

    if pitch_type in df2['pitch_type'].unique():
        data2 = df2[df2['pitch_type'] == pitch_type]
        sns.histplot(data=data2, x='plate_x', y='plate_z', cmap="coolwarm", cbar=True, ax=axs[1], binwidth=0.3)
        axs[1].plot(x, y, linestyle='--', color='black')
        axs[1].set_title(f'{year2} {pitch_type}')
    else:
        axs[1].set_title(f'{year2} {pitch_type} (No data)')

    axs[0].set_xlim(x_min, x_max)
    axs[0].set_ylim(y_min, y_max)
    axs[1].set_xlim(x_min, x_max)
    axs[1].set_ylim(y_min, y_max)

    plt.show()

# ピッチタイプごとにプロットを表示
pitch_types = ['SL', 'FF', 'CH', 'CU', 'FC']

# 最大および最小座標を取得
x_min = min(df_2022['plate_x'].min(), df_2023['plate_x'].min())
x_max = max(df_2022['plate_x'].max(), df_2023['plate_x'].max())
y_min = min(df_2022['plate_z'].min(), df_2023['plate_z'].min())
y_max = max(df_2022['plate_z'].max(), df_2023['plate_z'].max())

for pitch_type in pitch_types:
    plot_pitch_location(df_2022, df_2023, 2022, 2023, pitch_type, x_min, x_max, y_min, y_max)


</code></pre>

![](https://pbs.twimg.com/media/FvXf65RaIAMWgNd?format=png\&name=large)
![](https://pbs.twimg.com/media/FvXf8J9aEAALE86?format=png\&name=large)
![](https://pbs.twimg.com/media/FvXf9OwaUAA-H3r?format=png\&name=large)
![](https://pbs.twimg.com/media/FvXgAw2aUAUey5j?format=png\&name=large)
![](https://pbs.twimg.com/media/FvXgB5MaUAEl5rX?format=png\&name=large)

***

# plate_x　、plate_z列のデータ型を浮動小数点数（float）に変換

このコードは、データフレームのデータ型を確認し、必要に応じて'plate_x'と'plate_z'の列を浮動小数点型に変換しています。最初に、df\_2022とdf\_2023の各列のデータ型を表示します。次に、astype()関数を使って'plate_x'と'plate_z'の列を浮動小数点型に変換し、その後もう一度データ型を確認しています。

<pre><code class># Check data types
print(df_2022.dtypes)
print(df_2023.dtypes)

# Convert 'plate_x' and 'plate_z' columns to float
df_2022[['plate_x', 'plate_z']] = df_2022[['plate_x', 'plate_z']].astype(float)
df_2023[['plate_x', 'plate_z']] = df_2023[['plate_x', 'plate_z']].astype(float)

# Check data types again
print(df_2022.dtypes)
print(df_2023.dtypes)

# Now try running the function again
plot_pitch_location(df_2022, df_2023, 2022, 2023)
</code></pre>

![](https://pbs.twimg.com/media/FvXgE4AakAIiXPE?format=png\&name=large)

***

# 投球コースのヒートマップをプロットして比較4

このコードは、2つのデータフレーム（df\_2022 と df\_2023）に基づいて、2つの異なる年（year1 と year2）のピッチタイプ（SL, FF, CH, CU, FC）ごとにピッチ位置のヒートマップをプロットし、ストライクゾーンを追加して表示する関数 plot_pitch_location を定義しています。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2):
    pitch_types = ['SL', 'FF', 'CH', 'CU', 'FC']
    fig, axs = plt.subplots(2, len(pitch_types), figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    for i, pitch_type in enumerate(pitch_types):
        if pitch_type in df1['pitch_type'].unique():
            data1 = df1[df1['pitch_type'] == pitch_type]
            
            sns.kdeplot(x=data1['plate_x'], y=data1['plate_z'], cmap="coolwarm", cbar=True, ax=axs[0, i], fill=True, bw_method=0.1)
            axs[0, i].set_title(f'{year1} {pitch_type}')
        else:
            axs[0, i].set_title(f'{year1} {pitch_type} (No data)')

        if pitch_type in df2['pitch_type'].unique():
            data2 = df2[df2['pitch_type'] == pitch_type]
            sns.kdeplot(x=data2['plate_x'], y=data2['plate_z'], cmap="coolwarm", cbar=True, ax=axs[1, i], fill=True, bw_method=0.1)
            axs[1, i].set_title(f'{year2} {pitch_type}')
        else:
            axs[1, i].set_title(f'{year2} {pitch_type} (No data)')

    plt.show()

plot_pitch_location(df_2022, df_2023, 2022, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FvXgHrSaEAIczhl?format=png\&name=large)

***

# 投球コースのヒートマップをプロットして比較5

このコードは、2つのデータフレーム（df\_2022 と df\_2023）に基づいて、2つの異なる年（year1 と year2）のスライダーピッチ（SL）のピッチ位置のヒートマップをプロットし、ストライクゾーンを追加して表示する関数 plot_pitch_location を定義しています。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2):
    pitch_types = ['SL']
    fig, axs = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    for i in range(2):
        if i == 0:
            data = df1[df1['pitch_type'].isin(pitch_types)]
            sns.kdeplot(x=data['plate_x'], y=data['plate_z'], cmap="coolwarm", cbar=True, ax=axs[i], fill=True, bw_method=0.1)
            axs[i].set_title(f'{year1} {",".join(pitch_types)}')
        else:
            data = df2[df2['pitch_type'].isin(pitch_types)]
            sns.kdeplot(x=data['plate_x'], y=data['plate_z'], cmap="coolwarm", cbar=True, ax=axs[i], fill=True, bw_method=0.1)
            axs[i].set_title(f'{year2} {",".join(pitch_types)}')

    plt.show()

plot_pitch_location(df_2022, df_2023, 2022, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FvXgPYXakAYuEno?format=png\&name=large)

***

# 投球コースのヒートマップをプロットして比較6

このコードは、2つのデータフレーム（df\_2022 と df\_2023）に基づいて、2つの異なる年（year1 と year2）のフォーシーム・ファストボール（FF）のピッチ位置のヒートマップをプロットし、ストライクゾーンを追加して表示する関数 plot_pitch_location を定義しています。

<pre><code class>import seaborn as sns

def plot_pitch_location(df1, df2, year1, year2):
    pitch_types = ['FF']
    fig, axs = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)
    plt.subplots_adjust(wspace=0.1, hspace=0.1)

    # ストライクゾーンの座標
    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]

    for i in range(2):
        if i == 0:
            data = df1[df1['pitch_type'].isin(pitch_types)]
            sns.kdeplot(x=data['plate_x'], y=data['plate_z'], cmap="coolwarm", cbar=True, ax=axs[i], fill=True, bw_method=0.1)
            axs[i].set_title(f'{year1} {",".join(pitch_types)}')
        else:
            data = df2[df2['pitch_type'].isin(pitch_types)]
            sns.kdeplot(x=data['plate_x'], y=data['plate_z'], cmap="coolwarm", cbar=True, ax=axs[i], fill=True, bw_method=0.1)
            axs[i].set_title(f'{year2} {",".join(pitch_types)}')

        # ストライクゾーンを描画
        axs[i].plot(x, y, color='black', linestyle='--')

        # グラフの範囲を設定
        axs[i].set_xlim([-3, 3])
        axs[i].set_ylim([-2, 7])

    plt.show()

plot_pitch_location(df_2022, df_2023, 2022, 2023)

</code></pre>

![](https://pbs.twimg.com/media/FvXgWhxakAAOhQH?format=png\&name=large)

***

今度は打撃でヒートマップを作ってみよう

以上