PowerPoint(パワポ)ドキュメント作成をPythonで自動化する方法について紹介します。
今回は、パワーポイントでグラフ(チャート)を自動化する方法を説明したいと思います。今回扱うグラフは散布図です。
PowerPointではグラフ(チャート)を頻繁に使いますね。おそらく、多くの人はExcelやその他のツールを使ってグラフを作成して、パワーポイントに貼り付けるという方法を用いるのではないでしょうか!?
しかし、毎回Excelでグラフを作成して、貼り付けるのが面倒・・・という方は、パワーポイントでグラフを作ってしまうのも良いでしょう。
パワーポイントで簡単なグラフを作るならば、Python-pptxを使えばサクッと出来てしまいます。但し、Python-pptxでは細かい設定が出来ないので、今回の記事は、簡単な図をパワーポイント上で作ることを自動化したい!という方向けの記事になっております。
まずはスライドの作成
今回必要なモジュールのインポートと、Python-pptxでパワーポイントの新規スライド作成を行います。新規スライド作成に関する説明は、以前の記事を参照してください。
from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlChartType.html?highlight=scatter#xl-chart-type
from pptx.enum.chart import XL_TICK_MARK
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlTickMark.html#xltickmark
from pptx.enum.chart import XL_TICK_LABEL_POSITION
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlTickLabelPosition.html#xlticklabelposition
from pptx.enum.chart import XL_LEGEND_POSITION
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlLegendPosition.html#xllegendposition
from pptx.enum.chart import XL_MARKER_STYLE
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlMarkerStyle.html#xlmarkerstyle
from pptx.dml.color import RGBColor
#https://python-pptx.readthedocs.io/en/latest/api/dml.html#pptx.dml.color.RGBColor
from pptx.enum.chart import XL_MARKER_STYLE
#https://python-pptx.readthedocs.io/en/latest/api/enum/XlMarkerStyle.html#xlmarkerstyle
from pptx.enum.dml import MSO_LINE
#https://python-pptx.readthedocs.io/en/latest/api/enum/MsoLineDashStyle.html#msolinedashstyle
#Presentaionオブジェクトを生成
ppt = Presentation()
#白紙のスライドを選択
slide_layout = ppt.slide_layouts[6]
#白紙のスライドを追加
slide = ppt.slides.add_slide(slide_layout_6)
#ここにコードを追加していきます
ppt.save("./test.pptx")
Pythonでパワーポイントを自動化:グラフ(チャート)の作成
散布図を作成するには、まず、XyChartDataオブジェクトを作成します。
次に、add_seriesメソッドで系列を追加し、各系列にデータを追加します。
各系列にデータを追加したら、add_chartメソッドに、散布図を表すXL_CHART_TYPE.XY_SCATTER、チャート左上の座標, チャートの幅と高さ、XyChartDataオブジェクトを渡します。
add_chartメソッドはGraphicFrameオブジェクト(*)を返します。GraphicFrameオブジェクトのchartを実行すると、Chartオブジェクトが生成されます。
(省略)
#XyCharDataオブジェクト生成
#https://python-pptx.readthedocs.io/en/latest/api/chart-data.html#pptx.chart.data.XyChartData
chart_data = XyChartData()
#系列の作成
series_0 = chart_data.add_series('Series 0')
series_1 = chart_data.add_series('Series 1')
series_2 = chart_data.add_series('Series 2')
#各系列にデータ点を追加
for i in range(0, 10):
series_0.add_data_point(i, i)
series_1.add_data_point(i, 2 * i)
series_2.add_data_point(i, 3 * i)
# スライドにチャートを追加する
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
#x,y チャート左上の座標, cx,cyチャートの幅と高さ
chart = slide_6.shapes.add_chart(
XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data
).chart
(省略)
Pythonでパワーポイントを自動化:軸の設定を行う
では、図(チャートの体裁を少しカッコよくしていきましょう。まずは軸の設定を行います。
軸の設定では、ValueAxisオブジェクト(*)を使います。ValueAxisオブジェクトはChartオブジェクトのvalue_axisを実行すると生成されます。
軸のタイトルやグリッドライン、スケールを変更することが出来ます。
但し1点注意があります。それは、Python-pptxではy軸に関する設定しかできません。x軸は設定は出来ないので注意が必要です。
(省略)
#https://python-pptx.readthedocs.io/en/latest/api/chart.html#axis-objects
axis = chart.value_axis
axis.major_tick_mark = XL_TICK_MARK.OUTSIDE
#軸のタイトル
axis.has_title = True
axis.axis_title.text_frame.text = "Y"
#グリッドライン
axis.has_major_gridlines = True
#スケール
axis.maximum_scale = 30
axis.tick_label_position = XL_TICK_LABEL_POSITION.LOW
(省略)
Pythonでパワーポイントを自動化:凡例の設定
凡例の設定してみましょう。凡例の表示するかの設定は、chartオブジェクトのhas_legendにTrueかFalseを設定します。
凡例の位置の設定は、chartオブジェクトのlegend.positionにXL_LEGEND_POSITION.BOTTOMやXL_LEGEND_POSITION.RIGHTと設定します。凡例の位置はその他、LEFTやTOPなども設定出来ます。こちらを参照してください。
#legend
#https://python-pptx.readthedocs.io/en/latest/api/chart.html
chart.has_legend = True
#https://python-pptx.readthedocs.io/en/latest/api/chart.html#pptx.chart.chart.Legend
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
Pythonでパワーポイントを自動化:マーカーや線(ライン)設定
各系列のマーカーや線の設定では、FillFormatオブジェクト(*)とLineFormat(*)の各プロパティを介して行います。塗りつぶし関連はFillFormatを使用して、線のスタイルを変更はLineFormatを使用します。
マーカーの設定変更について簡単に説明します。chart.series[0].markerのようにすると、Markerオブジェクト(*)が返されます。Markerオブジェクトのformatを実行するとChartFormat(*)オブジェクトが返され、ChartFormatオブジェクトのfillを使うとFillFormatオブジェクトが返され、lineを使うとLineFormatプロパティをが返されます。
線のスタイル変更を行う際には、chart.series[0].formatとすると、ChartFormatオブジェクトが取得されますので、あとは、マーカー設定と同様に、ChartFormatオブジェクトのfillプロパティ、lineプロパティを使用します。
では、下記に色々な例を示すので、参考にしてください。
(省略)
#--------- Series_0の設定 ---------#
#Markerの塗りつぶしを解除=透明にする
chart.series[0].marker.format.fill.background()
#Makrerの枠線の種類を変更
#https://python-pptx.readthedocs.io/en/latest/api/enum/MsoLineDashStyle.html
chart.series[0].marker.format.line.dash_style = MSO_LINE.LONG_DASH_DOT
#Markerの枠線の太さを変更
chart.series[0].marker.format.line.width = Pt(2)
#Markerの枠線の色を変更
##https://python-pptx.readthedocs.io/en/latest/api/dml.html#pptx.dml.color.colorformat
chart.series[0].marker.format.line.color.rgb = RGBColor.from_string("Ff0000")
#--------- Series_1の設定 ---------#
#Markerのスタイルを変更
##https://python-pptx.readthedocs.io/en/latest/api/enum/XlMarkerStyle.html#xlmarkerstyle
chart.series[1].marker.style = XL_MARKER_STYLE.CIRCLE
#Markerのサイズを変更(2から72の範囲内の整数を設定。単位はポイント)
chart.series[1].marker.size = 18
#Markerの塗りつぶしの色を変更。塗りつぶしをお行うためには、fill.solid()をまず実行
chart.series[1].marker.format.fill.solid()
chart.series[1].marker.format.fill.fore_color.rgb = RGBColor(255, 255, 0)
#--------- Series_2の設定 ---------#
#Markerを消す
chart.series[2].marker.style = None
#線を追加
chart.series[2].format.fill.solid()
#Markerの枠線のスタイルを変更
chart.series[2].format.line.dash_style = MSO_LINE.DASH_DOT
#線の太さを変更
chart.series[2].format.line.width = Pt(2)
#線の色を変更
chart.series[2].format.line.color.rgb = RGBColor.from_string("000080")
(省略)
完成図
上のコードを実行すると以下のような図が出来るはずです。
