2021/ダルビッシュ選手 球種コースなど

前回作成したざっくりストライクゾーンを使って、ダルビッシュ選手の投球データを確認<br>※前回 → [ストライクゾーンのデータ (pybaseball)](https://hide.ac/articles/LHdcE7uLM)

***

# ダルビッシュ選手のデータで確認 (2021年)

<pre><code>!pip install pybaseball
from pybaseball import statcast
df = statcast(start_dt='2021-04-01', end_dt='2021-12-31')
df_darvish = df[df['pitcher'] == 506433]</code></pre>

***

# 2021年 ダルビッシュ選手 / 球種とコースをplot

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

# データを pitch_type ごとにグループ分けする
grouped = df_darvish.groupby('pitch_type')

# 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)

# 凡例を表示する
# plt.legend()

plt.xlim(-3, 3)
plt.ylim(-2, 6)
plt.xlabel('Plate X')
plt.ylabel('Plate Z')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

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

# グラフを表示する
plt.show()</code></pre>

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

***

# vs左打者 & グラフ題名を2行へ

<pre><code>
# vs左打者
df_darvish_L = df_darvish[df_darvish['stand'] == 'L']

grouped = df_darvish_L.groupby('pitch_type')

for pitch_type, data in grouped:
  plt.scatter(data['plate_x'], data['plate_z'], label=pitch_type)

# 凡例を表示する
# plt.legend()

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

plt.xlabel('Plate X')
plt.ylabel('Plate Z')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

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

# 題名2行
plt.title("vs left-handed batter\n(the batter is on the right side of the graph)")

# グラフを表示する
plt.show()</code></pre>

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

***

# 球種

<pre><code>pitch_types = df_darvish_L['pitch_type'].unique()
print(pitch_types)</code></pre>

\['FS' 'CU' 'FC' 'FF' 'SL' 'SI' 'KC' 'CH' 'CS']

| variey of pitches | Description     |
| ----------------- | --------------- |
| FS                | splitter        |\
| CU                | curveball       |\
| FC                | cutter          |\
| FF                | 4-seam fastball |\
| SL                | slider          |\
| SI                | sinker          |\
| KC                | knuckle curve   |\
| CH                | changeup        |\
| CS                | screwball       |

***

# スライダー(SL) vs左打者 / ストライゾーンに対して

<pre><code>df_darvish_L_cs = df_darvish_L[df_darvish_L['pitch_type'] == 'SL']
plt.scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], label='SL')

plt.xlim(-3, 3)
plt.ylim(-2, 6)
plt.xlabel('Plate X')
plt.ylabel('Plate Z')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.grid(which='both', linestyle='--', color='gray', alpha=0.5)
plt.title("vs left-handed batter\n(the batter is on the right side of the graph)")

# ストライクゾーン

import matplotlib.pyplot as plt

x = [-0.88, 0.88, 0.88, -0.88, -0.88]
y = [1.51, 1.51, 3.4, 3.4, 1.51]
plt.fill(x, y, color='r', alpha=0.3)

plt.show()</code></pre>

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

***

# 4シーム(FF) vs左打者 / ストライゾーンに対して

<pre><code>df_darvish_L_cs = df_darvish_L[df_darvish_L['pitch_type'] == 'FF']
plt.scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], label='FF')

plt.xlim(-3, 3)
plt.ylim(-2, 6)
plt.xlabel('Plate X')
plt.ylabel('Plate Z')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
plt.grid(which='both', linestyle='--', color='gray', alpha=0.5)
plt.title("vs left-handed batter\n(the batter is on the right side of the graph)")

# ストライクゾーン

import matplotlib.pyplot as plt

x = [-0.88, 0.88, 0.88, -0.88, -0.88]
y = [1.51, 1.51, 3.4, 3.4, 1.51]
plt.fill(x, y, color='r', alpha=0.3)

plt.show()</code></pre>

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

***

# 全球種 vs左打者 / ストライゾーンに対して　※グラフ分割

<pre><code>pitch_types = df_darvish_L['pitch_type'].unique()
pitch_types = [pt for pt in pitch_types if pt != 'CS']
fig, axs = plt.subplots(3, 3, figsize=(15, 15))

for i, pitch_type in enumerate(pitch_types):
    df_darvish_L_cs = df_darvish_L[df_darvish_L['pitch_type'] == pitch_type]
    axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], label=pitch_type)
    axs[i//3,i%3].set_xlim(-3, 3)
    axs[i//3,i%3].set_ylim(-2, 6)
    axs[i//3,i%3].set_xlabel('Plate X')
    axs[i//3,i%3].set_ylabel('Plate Z')
    axs[i//3,i%3].legend()
    axs[i//3,i%3].grid(which='both', linestyle='--', color='gray', alpha=0.5)
    axs[i//3,i%3].set_title(pitch_type)

# ストライクゾーン
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(3):
  for j in range(3):
    axs[i, j].fill(x, y, color='r', alpha=0.3)

plt.show()
</code></pre>

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

\--

# 全球種 vs左打者 / ストライゾーンに対して　※グラフ1つ

<pre><code># vs左打者
df_darvish_L = df_darvish[df_darvish['stand'] == 'L']

grouped = df_darvish_L.groupby('pitch_type')

for pitch_type, data in grouped:
  plt.scatter(data['plate_x'], data['plate_z'], label=pitch_type)

# 凡例を表示する
# plt.legend()

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

plt.xlabel('Plate X')
plt.ylabel('Plate Z')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

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

# 題名2行
plt.title("vs left-handed batter\n(the batter is on the right side of the graph)")

# ストライクゾーン
import matplotlib.patches as patches

x = [-0.88, 0.88, 0.88, -0.88, -0.88]
y = [1.51, 1.51, 3.4, 3.4, 1.51]
plt.gca().add_patch(patches.Polygon(list(zip(x, y)), edgecolor='red', facecolor='pink', linewidth=2, alpha=0.5))

# グラフを表示する
plt.show()</code></pre>

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

***

# 全球種 vs左打者 / ストライク(空振り、ファール含む)になったもの

<pre><code>pitch_types = df_darvish_L['pitch_type'].unique()
pitch_types = [pt for pt in pitch_types if pt != 'CS']
fig, axs = plt.subplots(3, 3, figsize=(15, 15))

for i, pitch_type in enumerate(pitch_types):
    df_darvish_L_cs = df_darvish_L[(df_darvish_L['pitch_type'] == pitch_type) & (df_darvish_L['type'] == 'S')]
    axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], label=pitch_type)
    axs[i//3,i%3].set_xlim(-3, 3)
    axs[i//3,i%3].set_ylim(-2, 6)
    axs[i//3,i%3].set_xlabel('Plate X')
    axs[i//3,i%3].set_ylabel('Plate Z')
    axs[i//3,i%3].legend()
    axs[i//3,i%3].grid(which='both', linestyle='--', color='gray', alpha=0.5)
    axs[i//3,i%3].set_title(pitch_type)

# ストライクゾーン
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(3):
    for j in range(3):
        axs[i, j].fill(x, y, color='r', alpha=0.3)

plt.show()
</code></pre>

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

***

# ストライクの種類

<pre><code>print(df['description'].unique())
</code></pre>

\['hit_into_play' 'foul' 'called_strike' 'ball' 'blocked_ball'
'swinging_strike' 'swinging_strike_blocked' 'foul_tip' 'foul_bunt'
'hit_by_pitch' 'missed_bunt' 'pitchout' 'bunt_foul_tip' 'foul_pitchout']

***

# 全球種 vs左打者 / ストライク(空振り、ファール含む)になったもの　※色分け

<pre><code>color_map = {'hit_into_play': 'purple', 'foul': 'blue', 'called_strike': 'green', 
 'swinging_strike': 'red', 'swinging_strike_blocked': 'orange', 'foul_tip': 'black', 
 'foul_bunt': 'pink', 'missed_bunt': 'gray', 'pitchout': 'yellow', 'bunt_foul_tip': 'brown', 
 'foul_pitchout': 'cyan'}

color = [color_map[desc] for desc in df_darvish_L_cs['description']]
axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], c=color)

pitch_types = df_darvish_L['pitch_type'].unique()
pitch_types = [pt for pt in pitch_types if pt != 'CS']
fig, axs = plt.subplots(3, 3, figsize=(15, 15))

for i, pitch_type in enumerate(pitch_types):
    df_darvish_L_cs = df_darvish_L[(df_darvish_L['pitch_type'] == pitch_type) & (df_darvish_L['type'] == 'S')]
    color = [color_map[desc] for desc in df_darvish_L_cs['description']]
    axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], c=color)
    axs[i//3,i%3].set_xlim(-3, 3)
    axs[i//3,i%3].set_ylim(-2, 6)
    axs[i//3,i%3].set_xlabel('Plate X')
    axs[i//3,i%3].set_ylabel('Plate Z')
    axs[i//3,i%3].grid(which='both', linestyle='--', color='gray', alpha=0.5)
    axs[i//3,i%3].set_title(pitch_type)

    axs[i//3,i%3].legend()

    axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], c=color, label=df_darvish_L_cs['description'])

# ストライクゾーン
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(3):
  for j in range(3):
    axs[i, j].fill(x, y, color='r', alpha=0.2)

plt.show()
</code></pre>

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

***

# 全球種 vs左打者 / 見逃しストライク

<pre><code># called strikeのみ。vs左打者

color_map = {'hit_into_play': 'purple', 'foul': 'blue', 'called_strike': 'green',
'swinging_strike': 'red', 'swinging_strike_blocked': 'orange', 'foul_tip': 'black',
'foul_bunt': 'pink', 'missed_bunt': 'gray', 'pitchout': 'yellow', 'bunt_foul_tip': 'brown',
'foul_pitchout': 'cyan'}

# color_mapを表示するためのラベルとハンドルを用意
labels = list(color_map.keys())
handles = [plt.Rectangle((0,0),1,1, color=color_map[label]) for label in labels]

pitch_types = df_darvish_L['pitch_type'].unique()
pitch_types = [pt for pt in pitch_types if pt != 'CS']
fig, axs = plt.subplots(3, 3, figsize=(15, 15))

for i, pitch_type in enumerate(pitch_types):
  df_darvish_L_cs = df_darvish_L[(df_darvish_L['pitch_type'] == pitch_type) & (df_darvish_L['type'] == 'S') & (df_darvish_L['description'] == 'called_strike')]
  color = [color_map[desc] for desc in df_darvish_L_cs['description']]
  axs[i//3,i%3].scatter(df_darvish_L_cs['plate_x'], df_darvish_L_cs['plate_z'], c=color)
  axs[i//3,i%3].set_xlim(-3, 3)
  axs[i//3,i%3].set_ylim(-2, 6)
  axs[i//3,i%3].set_xlabel('Plate X')
  axs[i//3,i%3].set_ylabel('Plate Z')
  axs[i//3,i%3].grid(which='both', linestyle='--', color='gray', alpha=0.5)
  axs[i//3,i%3].set_title(pitch_type)

# ストライクゾーン
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(3):
  for j in range(3):
    axs[i, j].fill(x, y, color='r', alpha=0.3)

# color_mapを表示するためのラベルとハンドルを用意
labels = list(color_map.keys())
handles = [plt.Rectangle((0,0),1,1, color=color_map[label]) for label in labels]

# legendを作成し、グラフ外に表示
fig.legend(handles, labels, loc='center', bbox_to_anchor=(1.2, 0.5))

plt.show()
</code></pre>

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

***

# 全球種 vs右打者 / 見逃しストライク

<pre><code># called strikeのみ。vs右打者

# vs右打者
df_darvish_R = df_darvish[df_darvish['stand'] == 'R']

color_map = {'hit_into_play': 'purple', 'foul': 'blue', 'called_strike': 'green',
'swinging_strike': 'red', 'swinging_strike_blocked': 'orange', 'foul_tip': 'black',
'foul_bunt': 'pink', 'missed_bunt': 'gray', 'pitchout': 'yellow', 'bunt_foul_tip': 'brown',
'foul_pitchout': 'cyan'}

# color_mapを表示するためのラベルとハンドルを用意
labels = list(color_map.keys())
handles = [plt.Rectangle((0,0),1,1, color=color_map[label]) for label in labels]

pitch_types = df_darvish_R['pitch_type'].unique()
pitch_types = [pt for pt in pitch_types if pt != 'CS']
fig, axs = plt.subplots(3, 3, figsize=(15, 15))

for i, pitch_type in enumerate(pitch_types):
  df_darvish_R_cs = df_darvish_R[(df_darvish_R['pitch_type'] == pitch_type) & (df_darvish_R['type'] == 'S') & (df_darvish_R['description'] == 'called_strike')]
  color = [color_map[desc] for desc in df_darvish_R_cs['description']]
  axs[i//3,i%3].scatter(df_darvish_R_cs['plate_x'], df_darvish_R_cs['plate_z'], c=color)
  axs[i//3,i%3].set_xlim(-3, 3)
  axs[i//3,i%3].set_ylim(-2, 6)
  axs[i//3,i%3].set_xlabel('Plate X')
  axs[i//3,i%3].set_ylabel('Plate Z')
  axs[i//3,i%3].grid(which='both', linestyle='--', color='gray', alpha=0.5)
  axs[i//3,i%3].set_title(pitch_type)

# ストライクゾーン
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(3):
  for j in range(3):
    axs[i, j].fill(x, y, color='r', alpha=0.3)

# color_mapを表示するためのラベルとハンドルを用意
labels = list(color_map.keys())
handles = [plt.Rectangle((0,0),1,1, color=color_map[label]) for label in labels]

# legendを作成し、グラフ外に表示
fig.legend(handles, labels, loc='center', bbox_to_anchor=(1.2, 0.5))

plt.show()
</code></pre>

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

***

この座標はキャッチャーから見た視点です。<br>右に左打者、左に右打者がいます。

アウトカウントごとなど、また調べよう