python パワポ作成メモ

pythoパワポ

<pre><code class>
import matplotlib.pyplot as plt
from pptx import Presentation
from pptx.util import Inches, Pt

# ID と選手名のマッピング
id_to_name_mapping = {
    686894: "joey wiemer",
    605170: "victor caratini",
    649966: "luis urías",
    605119: "brian anderson",
}

# 色のマッピング
colors = {'FF': 'blue', 'SL': 'red', 'FS': 'green', 'ST': 'orange', 'CU': 'purple', 'SI': 'brown', 'FC': 'grey'}

# 2023年6月10日のデータをフィルタリング
df_660261_fujinami = df_660261_all_dates[df_660261_all_dates['game_date'] == '2023-06-10']

unique_batters = sorted(df_660261_fujinami['at_bat_number'].unique())
nrows = len(unique_batters)
ncols = 1

# PowerPointプレゼンテーションを作成
prs = Presentation()

grouped_by_batter = df_660261_fujinami.groupby('at_bat_number')

# グラフのタイトル用に結果データを取得
df_660261_2023_06_10_results_filtered_sorted = df_660261_all_dates[df_660261_all_dates['game_date'] == '2023-06-10'][['batter', 'events', 'des', 'at_bat_number']].dropna(subset=['events']).sort_values(by='at_bat_number')
results_data = df_660261_2023_06_10_results_filtered_sorted[['batter', 'events', 'des']]

des_list = df_660261_2023_06_10_results_filtered_sorted['des'].tolist()

for i, batter in enumerate(unique_batters):
    data_by_batter = grouped_by_batter.get_group(batter)

    fig, ax = plt.subplots(figsize=(8, 6))

    x = [-0.88, 0.88, 0.88, -0.88, -0.88]
    y = [1.51, 1.51, 3.4, 3.4, 1.51]

    ax.fill(x, y, color='r', alpha=0.1)

    grouped_by_pitch_type = data_by_batter.groupby('pitch_type')

    for pitch_type, data in grouped_by_pitch_type:
        ax.scatter(data['plate_x'], data['plate_z'], label=pitch_type, s=200, color=colors.get(pitch_type, 'grey'))

        hit_data = data[data['events'].isin(['single', 'double', 'triple', 'home_run'])]
        if not hit_data.empty:
            ax.scatter(hit_data['plate_x'], hit_data['plate_z'], marker='x', s=100, label=f'Hit ({pitch_type})',
                       color=colors.get(pitch_type, 'grey'))

        for idx, row in data.iterrows():
            ax.text(row['plate_x'], row['plate_z'], f"{row['pitch_number']}", fontsize=12, ha='center', va='center',
                    color='white')

    batter_id = results_data.iloc[i]['batter']
    batter_name = id_to_name_mapping[batter_id]

    inning = data_by_batter.iloc[0]['inning']
    outs_when_up = data_by_batter.iloc[0]['outs_when_up']

    ax.set_title(f'{batter_name} : Inning {inning}, Outs {outs_when_up}')
    ax.set_xlim(-3, 3)
    ax.set_ylim(-2, 6)
    ax.set_xlabel('Plate X')
    ax.set_ylabel('Plate Z')
    ax.legend()
    ax.grid(which='both', linestyle='--', color='gray', alpha=0.5)

    fig.savefig('plot.png')

    # スライドを追加
    slide_layout = prs.slide_layouts[6]  # 6 is the index for a blank slide
    slide = prs.slides.add_slide(slide_layout)

    # スライドにプロットを追加
    slide.shapes.add_picture('plot.png', Inches(0), Inches(1), width=Inches(4.7), height=Inches(4.5))

    # プロットの下にテキストボックスを追加
    left = Inches(1)
    top = Inches(5)
    width = height = Inches(5)
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame

    # テキストボックスに文章を追加
    p = tf.add_paragraph()
    p.text = f"{i+1}. {des_list[i]}"
    p.font.bold = True
    p.font.size = Pt(14)

    # プロットの右側にテーブルを追加
    left = Inches(4.5)
    top = Inches(1)
    width = height = Inches(4)

    # テーブルを作成
    rows = data_by_batter.shape[0]
    cols = 5  # ピッチ番号、ピッチタイプ、速度、スピンレート、スピン角度
    table = slide.shapes.add_table(rows+1, cols, left, top, width, height).table

    # テーブルのヘッダーを設定
    for j in range(5):
      cell = table.cell(0, j)
      cell.text = ["Pitch Number", "Type", "Speed (mph)", "Spin Rate (rpm)", "Spin Angle (degrees)"][j]
      run = cell.text_frame.paragraphs[0].runs[0]
      run.font.name = 'Meiryo UI'
      run.font.size = Pt(12)


    # データを追加
    for idx, (index, row) in enumerate(data_by_batter.iterrows(), start=0):
        table.cell(idx+1, 0).text = str(row['pitch_number'])
        table.cell(idx+1, 1).text = str(row['pitch_type'])
        table.cell(idx+1, 2).text = str(row['release_speed'])
        table.cell(idx+1, 3).text = str(row['release_spin_rate'])
        table.cell(idx+1, 4).text = str(row['spin_axis'])

        # フォントの設定を変更
        for j in range(5):
            run = table.cell(idx+1, j).text_frame.paragraphs[0].runs[0]
            run.font.name = 'Meiryo UI'
            run.font.size = Pt(13)

    # サイズと位置を調整
    table.columns[0].width = Inches(1.5)
    table.columns[1].width = Inches(1.0)
    table.columns[2].width = Inches(1.0)
    table.columns[3].width = Inches(1.0)
    table.columns[4].width = Inches(1.0)

# プレゼンテーションを保存
prs.save('660261_fujinami.pptx')


</code></pre>

調整方法

グラフの位置を調整するコード:

<pre><code>slide.shapes.add_picture('plot.png', Inches(0.3), Inches(1), width=Inches(6), height=Inches(4.5))
</code></pre>

ここではadd_pictureメソッドを用いてグラフの画像をスライドに追加しています。最初の2つの引数は画像を配置する位置（左から0.3インチ、上から1インチ）を示し、widthとheight引数は画像の幅と高さ（6インチと4.5インチ）を示します。

表の位置を調整するコード:

<pre><code>left = Inches(7)
top = Inches(1)
width = height = Inches(4)
table = slide.shapes.add_table(rows+1, cols, left, top, width, height).table

</code></pre>

ここではadd_tableメソッドを用いてテーブルをスライドに追加しています。leftとtopはテーブルを配置する位置（左から7インチ、上から1インチ）を示し、widthとheightはテーブルの幅と高さ（どちらも4インチ）を示します。

表のサイズを調整するコード:

<pre><code>table.columns[0].width = Inches(1.5)
table.columns[1].width = Inches(1.0)
table.columns[2].width = Inches(1.0)
table.columns[3].width = Inches(1.0)
table.columns[4].width = Inches(1.0)

</code></pre>

ここでは、テーブルの各列の幅を個別に設定しています。1列目は1.5インチ、2～5列目は各1インチに設定しています。

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

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