見出し画像

PythonでグラフをPowerPointに整理する


今回やりたいこと

データをグラフ化したものを整理する作業を自動化したい。その例として図1から図4のグラフデータをPowerPointに貼り付けるプログラムを作成する。

図1 グラフ1
図2 グラフ2
図3 グラフ3
図4 グラフ4

完成イメージは図5のような感じである。

図5 完成イメージ

ライブラリ

ライブラリとしてpython-pptxというライブラリを使用する。
pipによるインストールは以下の通り。

pip install python-pptx

表紙ページの作成

パワポファイルの作成は、pptx.Presentation()で作成できる。
以下のプログラムでは、作成するパワポファイルがすでにある場合は上書き、ない場合は新しく作成するようにしている。また、スライドサイズは16:9になるようにしている。

# ファイルが存在するかを判定
if os.path.isfile(pptx_filename):
   prs = pptx.Presentation(pptx_filename)
else:
   prs = pptx.Presentation()
   prs.slide_width  = Inches(16)
   prs.slide_height = Inches(9)

スライドのレイアウトは、白紙を選択している。
slide_layouts[数値]の数値の部分を変更することでレイアウト変更が可能。
レイアウト番号は、図6のようになっている。

blank_slide_layout = prs.slide_layouts[6]	# "白紙"のレイアウトオブジェクトを取得
slide1 = prs.slides.add_slide(blank_slide_layout)  # 白紙スライドの追加


図6 スライドのレイアウト

次にタイトルの文字を追加する。
テキストボックスをadd_textboxで追加し、text1_box.textで内容を追加している。
テキストボックスの追加が終わったら、saveでパワポファイルを保存している。

# textbox
text1_left = Cm(16.16)
text1_top = Cm(10.53)
text1_width = Cm(8.3)
text1_height = Cm(1.8)
text1_box = slide1.shapes.add_textbox(text1_left, text1_top, text1_width, text1_height)  # テキストボックスの追加
text1_box.text = titletext  # 内容の追加
text1_box.text_frame.paragraphs[0].font.size = Pt(36)  # フォントサイズの変更
    
# saveで保存
prs.save(pptx_filename)

グラフの貼り付けページの作成

白紙スライドの追加までは、表紙ページと同じである。
1ページに4枚ずつ貼る場合は、以下のようにするとよい。
add_picture(画像のパス、X座標、Y座標、横幅、縦幅)で画像を貼ることができる。

# ファイルが存在するかを判定
if os.path.isfile(pptx_filename):
   prs = pptx.Presentation(pptx_filename)
else:
   prs = pptx.Presentation()
   prs.slide_width  = Inches(16)
   prs.slide_height = Inches(9)

blank_slide_layout = prs.slide_layouts[6]	# "白紙"のレイアウトオブジェクトを取得
slide1 = prs.slides.add_slide(blank_slide_layout)  # 白紙スライドの追加
    
for k, gname in enumerate(graphname, 1):
    if k == 1:
       # image
       slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(4.76), Cm(0.79),  Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
    elif k == 2:
       # image
       slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(23.09), Cm(0.79),  Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
    elif k == 3:
       # image
       slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(4.76), Cm(10.96), Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
    elif k == 4:
       # image
       slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(23.09), Cm(10.96), Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
    
# saveで保存
prs.save(pptx_filename)

コード全体

現実的には、表紙ページとグラフページは、関数化しておくと汎用性が高まる。

import pptx
from pptx.util import Pt,Cm, Inches
import os

def create_cover_pptx(pptx_filename, titletext):
    # ファイルが存在するかを判定
    if os.path.isfile(pptx_filename):
        prs = pptx.Presentation(pptx_filename)
    else:
        prs = pptx.Presentation()
        prs.slide_width  = Inches(16)
        prs.slide_height = Inches(9)

    blank_slide_layout = prs.slide_layouts[6]	# "白紙"のレイアウトオブジェクトを取得
    slide1 = prs.slides.add_slide(blank_slide_layout)  # 白紙スライドの追加

    # textbox
    text1_left = Cm(16.16)
    text1_top = Cm(10.53)
    text1_width = Cm(8.3)
    text1_height = Cm(1.8)
    text1_box = slide1.shapes.add_textbox(text1_left, text1_top, text1_width, text1_height)  # テキストボックスの追加
    text1_box.text = titletext  # 内容の追加
    text1_box.text_frame.paragraphs[0].font.size = Pt(36)  # フォントサイズの変更
    
    # saveで保存
    prs.save(pptx_filename)

def create_page_pptx(pptx_filename, graphname, dirpath):
    # ファイルが存在するかを判定
    if os.path.isfile(pptx_filename):
        prs = pptx.Presentation(pptx_filename)
    else:
        prs = pptx.Presentation()
        prs.slide_width  = Inches(16)
        prs.slide_height = Inches(9)

    blank_slide_layout = prs.slide_layouts[6]	# "白紙"のレイアウトオブジェクトを取得
    slide1 = prs.slides.add_slide(blank_slide_layout)  # 白紙スライドの追加
    
    for k, gname in enumerate(graphname, 1):
        if k == 1:
            # image
            slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(4.76), Cm(0.79),  Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
        elif k == 2:
            # image
            slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(23.09), Cm(0.79),  Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
        elif k == 3:
            # image
            slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(4.76), Cm(10.96), Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
        elif k == 4:
            # image
            slide1.shapes.add_picture(os.path.join(dirpath, gname), Cm(23.09), Cm(10.96), Cm(11.84), Cm(9.47)) # X座標、Y座標、横幅、縦幅
    
    # saveで保存
    prs.save(pptx_filename)
    

# パワポファイルのパス
pptxpath = "データ結果まとめ.pptx"

# 表紙の作成
create_cover_pptx(pptxpath, "グラフデータ")

# グラフのパス
dir_path = "./結果グラフ"
files = [f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))]

# グラフをパワポに貼り付けて整理する
create_page_pptx(pptxpath, files, dir_path)
                
        

サイト

https://sites.google.com/view/elemagscience/%E3%83%9B%E3%83%BC%E3%83%A0


この記事が気に入ったらサポートをしてみませんか?