PythonでグラフをPowerPointに整理する
今回やりたいこと
データをグラフ化したものを整理する作業を自動化したい。その例として図1から図4のグラフデータをPowerPointに貼り付けるプログラムを作成する。
完成イメージは図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) # 白紙スライドの追加
次にタイトルの文字を追加する。
テキストボックスを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
この記事が気に入ったらサポートをしてみませんか?