Pythonライブラリ(openpyxl)でExcelのグラフを作成する方法【徹底解説】

スポンサーリンク
Python外部ライブラリ(openpyxl)_グラフの作成_rev0.2 openpyxl

本記事ではMS-Office ExcelをPythonで操作するライブラリとして「openpyxl」の解説をしていきます。

Excelには多くの機能が搭載されておりますので、一記事で簡潔に解説することはできません。従いまして、大項目(機能)ごとに分けた連載記事として執筆しています。

Part7_目次
図1 連載目次と今後の予定

これまでの連載の中で、openpyxlを使う上で必ず知っておかなければならない必須事項を取り上げてきました。今回の記事を読み進めていくにはある程度、前提知識を必要とします。あらかじめ、関連記事に目を通して頂けますと、以降の解説の理解がより進むと思われます。

ブックの作成・保存、ワークシートの追加、それから行、列、セル、各オブジェクトの取得とその操作について<連載1,2回目>

セルの書式設定(フォントや罫線など装飾)に関しては<連載3>回目が参考になります。


さて、連載7回目となる今回はExcelにグラフを挿入する手順の概要について解説していきます。グラフはビジネスシーンにおいて使用頻度の高いExcelがもつ強力機能の一つです。

グラフの活用する例として、たとえば、月々の売上データをグラフの定型フォーマットにまとめて推移を可視化するといったことはよくあることでしょう。

Excelでのグラフ作成をプログラムで自動化できれば面倒な定型作業を一瞬で終わらせることができます。Excelとの相性がいいPythonで操作できる点も見逃せません。

本記事がopenpyxlライブラリによるグラフ操作習得の一助になれば幸いです。

ご承知のとおりExcelで扱うことができるグラフには多くの種類があります。

1記事の中でその全てを網羅することは困難ですので、今回も【概要編】【実践編】と複数回に分けて解説を進めていきます。

概要編】となる今回はグラフ作成の流れ(フロー)と使用頻度の高い重要なクラス(オブジェクト)の詳細仕様・階層構造などに焦点を当てます。

実践編となる次回以降は、「折れ線グラフ」「棒グラフ」「散布図」といった具体的なグラフの作成事例とTipsを紹介していきます。どうぞおたのしみに。


この記事を読むことでopenpyxlのExcel操作に関する、次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。

➀. グラフの構成要素に対応するオブジェクトの種類とその階層構造を把握できる。

➁. どんな種類のグラフにも共通するの作成手順(フロー)を理解できる。

➂. 主要なクラスの詳細書式と従属プロパティについて知ることができる。

本サイトでの紹介例は一例です。また、関数などの省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて公式サイトなどを参照してください。

記事内で動作確認した開発環境とバージョン情報は次のとおりとなります。異なる環境・バージョンのライブラリを使う際はこの点、ご留意ください。

・Python 3.7.6(64bit)

・openpyxl 3.0.3

・JupyterNotebook 6.0.3

・Microsoft Office Personal 2016

スポンサーリンク

1. openpyxlによるグラフ作成の基本

Excelには折れ線、棒グラフ、散布図、円・・・といった実に様々な使途に最適なグラフを作図できます。openpyxlにもグラフ作成に関連する専用のクラスが豊富に提供されており、実用的なグラフを容易に作ることができます。

本節でopenpyxlを使ったグラフ作成の基本手順について説明していきます。

具体的な手順の解説に入る前に、Excelでグラフを作図する際に理解しておきたい用語やグラフの構成要素についてここで、整理しておきましょう。記事内の用語表現もこちらに統一しています。

次の図2は、ある年の一年間の降水量を各都市別に示した2次元テーブル(表)から、横軸(X軸)を月、縦軸(Y軸)を降水量とした「折れ線グラフ」を描画する例を示しています。

Excelグラフの構成要素の基本
図2 月ごとの都市別の降水量の平均値(総務省HPより抜粋

一般的にExcelでは、横軸(X軸)の要素の集合ことを【項目】もしくは【カテゴリー(Categories)】と呼びます。(青色)

また、グラフのプロットエリアには複数本の都市別の折れ線グラフが重なっていますが、この集合のことを系列】もしくは【シリーズ(Series)】と呼称して(紫色)区別しています。

Excelでは、項目と系列は自由に入れ替えることができます。作成点でいま、テーブルの行列を項目・系列のどちらに指定しているのかを常に意識してグラフを作成する必要があります

そして、項目と系列のマトリックスにあたる個々の数値が縦軸(Y軸)のプロットエリアに【データ】として表示されます。(赤色)

さらに図3はExcelでグラフの編集ウィンドウ(データの選択)を表示させた例です。

左が【系列】、右が【項目】となり、それぞれの編集ボタンでデータの参照範囲の設定ができます。

Excelのデータの選択ダイアログ
図3 Excelのグラフの編集ウィンドウ(データの選択)

以降の解説では、これらのグラフに関する前提知識を元に解説をしています。

それでは、次節からは具体的な各種オブジェクトの扱い方とグラフの作成手順について詳しく解説していきます。

1.1 グラフの構成要素(オブジェクト階層)

グラフは図4のようにさまざまな要素によって構成されています。

タイトルや凡例・X(Y)軸などのように、グラフの種類を問わず共通のもの、一方でプロットエリアの構成要素、マーカー・ライン・ラベルなどターゲットとなるグラフの種類に応じて異なります。

プログラムでグラフを作るということは、これらの構成要素一つ一つに必要なデータや属性を設定していくことを意味しています。

グラフの構成要素
図4 グラフを構成するオブジェクト

Excelには、Workbook(ブック)やWorksheet(シート)、Row/Coloumn、Cellオブジェクト…といったようにクラス(オブジェクト)同士の包含関係または階層構造が存在します。<参考:連載1回目>

グラフにおいても同様で、グラフ本体となるChartオブジェクトを頂点にして、その配下には図5のような様々なクラス(オブジェクト)による階層構造になっています。

グラフの要素オブジェクトの階層構造
図5 グラフのオブジェクト階層構造

タイトルや凡例などChartオブジェクト直下の属性で設定取得できる構成要素もありますし、X(Y)軸、系列データのように、オブジェクト同士の階層構造を経て(メソッド(プロパティ)チェーン)設定・取得する要素もあります。

各クラスとオブジェクトについてはこのあとの節で詳しく解説します。

グラフの構成要素の概要をご理解いただいたことろで次項よりグラフ作成の流れフローを解説していきます。

1.2 グラフ作成の手順

本項ではグラフ作成の手順(フロー)について解説をしていきます。

大まかな手順としては、どのような種類のグラフであっても共通しており、簡単にまとめると次の3ステップで対応できます。

➀. Chartオブジェクトを取得する。

➁. データ・カテゴリの参照オブジェクトを取得し、Chartオブジェクトに設定する。

➂. WorkSheetオブジェクトに➁のChartオブジェクトを追加する。

もう少し、手順を細分化してみます。

➁のデータとカテゴリの参照オブジェクトを取得し設定する部分に関しては、目的のグラフの種類(折れ線?それとも散布図?などのように)によって2通りに分かれます。

1つ目の方法は複数個の系列データをまとめて一括で参照オブジェクト(Referenceオブジェクト)として取得するといったものです。

そして2つ目の方法は個々の系列データ(X軸とY軸を一組の対にしたデータ)の参照情報(Seriesオブジェクト)を取得し、SeriesコレクションとしてまとめるたものをChartオブジェクトの参照情報にするといったものです。

後者のSeriesオブジェクトを参照情報にする方法は全てのタイプのグラフに対応可能です。

前者の方法では散布図やバブルチャート等の一部対応できないグラフもありますが、その一方でコードが簡潔にまとまるといったメリットもあります。

グラフ作成手順のタイプ別使い分け表_rev0.1
図6 参照オブジェクトの使い分け

以上を踏まえてグラフ作成の全体フローを各パターンごとに解説していきます。

1.2.1 複数の系列をまとめて参照する

折れ線、棒グラフなどの各系列によって同じ項目(X軸の値)を共有するようなグラフのタイプでは、複数の系列データをまとめてReferenceオブジェクトとして一括参照します。

このタイプのグラフを作成する手順全体を体系化したのが次の図7になります。

Python_openpyxlによるグラフの作成フロー_系列データ一括取得_rev0.3
図7 グラフ作成の手順(系列をまとめて一括参照)

各ブロックについて補足します。

➀.「Chartオブジェクトを生成する

例えば折れ線グラフであれば「LineChartクラス」という専用のクラスが用意されていますので、インポートしてオブジェクトを生成します。このChartオブジェクトがグラフ本体(フレームワーク)となります。

➁.「Chartオブジェクトにグラフの構成要素を設定する

グラフには、タイトル、凡例、軸のタイトルなどさまざまな要素により構成されます。これらをChartオブジェクトに専用の属性(プロパティ)で追加・設定していきます。

➂.「データの参照情報をReferenceオブジェクトとして定義する

グラフが参照するセル範囲を定義します。ライブラリが必要とするセル範囲は2つあって、1つ目が「項目名(カテゴリ)の列」と「系列名の行」で挟まれた個々のデータ領域です。そして2つ目が、項目名(カテゴリ)となるセル範囲です。両者は、それぞれReferenceオブジェクトとしてまとめられて参照されます。(図8)

python_Referenceオブジェクトの参照領域(データ領域_項目名領域)_rev0.2
図8 Referenceオブジェクトの定義データ領域

➃.「Chartオブジェクトにデータを設定する

➂で取得したデータのReferenceオブジェクトを「add_data()メソッド」でChartオブジェクトに追加します。

➄.「Chartオブジェクトに項目名(カテゴリ)を設定する

➂で取得した項目名(カテゴリ)のReferenceオブジェクトを「set_categories()メソッド」でChartオブジェクトとに追加します。

➅.「系列データごとに装飾効果を適用する

グラフの系列データはSeriesオブジェクトとして管理されています。マーカーやライン、塗り潰しなどは、個々のSeriesオブジェクトの属性にて設定していきます。

➆.「Worksheetにグラフを挿入する

最後にWorksheetオブジェクトの「add_chart()メソッド」の引数にChartオブジェクトとCellアドレスを指定してシートにグラフを挿入します。

add_chart()メソッドの書式は以下のとおりです。

Worksheetオブジェクト

Worksheetオブジェクト.add_chart(chart, cell_Adr)


引数1: chart :挿入するchartオブジェクト(グラフ)を指定する

引数2: cell_Adr :グラフを挿入する位置を指定する ‘A1’, ‘B10’など

1.2.2 系列ごとにデータと項目を参照する

散布図やバブルチャートなどのように個々の系列によって異なる項目(X軸の値)を設定することができるタイプのグラフの場合は、<1.2.1>項のように、複数の系列をまとめて一括参照することはできません。

各系列ごとに項目(X軸のデータ)とそれに対応する値(Y軸のデータ)を1つの対とした系列データ情報をSeriesオブジェクトとして管理します。(X軸、Y軸はそれぞれReferenceオブジェクトとして参照します。)

このタイプのグラフを作成する手順全体を体系化したのが次の図9になります。

図9 グラフ作成の手順(系列を個別に参照)

Python_openpyxlによるグラフの作成フロー_系列データ個別取得_rev0.2
図9 グラフ作成の手順(系列を個別に参照)

先の<1.2.1>「複数の系列をまとめて参照する」項で解説したものと共通点が多いので、異なる部分のみを補足します。

➂.「系列データごとにデータ(XY軸)の参照情報を定義し設定する

系列ごとに異なる項目(X軸)をとり得るので、系列ごとにX軸のデータとY軸のデータ1組として、それぞれの参照情報をReferenceオブジェクトとして取得します。(図9 ➂-1, ➂-2)

個々の系列データはSeriesオブジェクトとしてまとめます。SeriesオブジェクトはSeriesクラスの引数に先程取得したReferenceオブジェクト(X軸とY軸の参照情報)と系列名を指定して取得します。(➂-3)

Seriesクラスの書式はこの後<2.3>項で解説します。

ここまでのイメージを図示すると図10のようになります。

Seriesオブジェクトの参照イメージ図
図10 系列とSeriesオブジェクの関係

そして、Chartオブジェクトの「series.append()メソッド」で系列データを1つずつ追加していきます。(図9 ➂-4)➂.は系列ごとに繰り返す必要があるので複数ある場合は、For文やWhile文などで繰り返し処理を実行します。

(<1.2.1>項のadd_data()メソッドは不要となります。また、Seriesクラスの引数に系列名を指定してオブジェクトを取得した場合は、set_categories()メソッドも不要となります。)

ここまでが、「グラフの概要」と「openpyxlを使ったグラフ作成手順」の解説となります。

以降の節からは「クラスの詳細仕様」と「グラフを構成する要素となる各種オブジェクト」について深堀りしていきます。

2. グラフを構成するオブジェクト詳細

Python_基本文法_内包表記

ここまでに、グラフ作成に必要となるクラス(オブジェクト)の階層構造<1.1項>や作成手順<1.2項>について概説してきました。

本節からは、いよいよ主要なクラス(Chart/Reference/Seriesクラス)の詳細仕様についてあらためて解説していきます。どのようなタイプのグラフであっても共通で利用するクラスとなります。

2.1 グラフ本体(Chartオブジェクト)

グラフの本体となるChartオブジェクトは、グラフの種類(折れ線・棒グラフ・散布図など…)に応じて専用のクラスが用意されています。

たとえば、一般的な「折れ線」であれば次のようにLineChartクラスからChartオブジェクトを取得します。

LineChartクラス

折れ線グラフ

from openpyxl.chart import LineChart

Chartオブジェクト = LineChart(marker, smooth)

引数: marker :マーカーの有無を設定する(デフォルトNone) True:マーカー有効/False:マーカー無効

引数: smooth :滑らかなラインを設定する(デフォルトNone) True:有効/False:無効

ほか省略可能な引数は多数,全てオプショナル引数

戻り値:Chartオブジェクト

その他のグラフのクラスについては<第3節>で紹介しますが、どのタイプのChartオブジェクトであったとしても主要なメソッドや属性(プロパティ)は共通です。

まずは、プロットするデータ(系列名)と項目名(カテゴリ)の参照情報をChartオブジェクトに追加・設定するメソッドです。

それぞれ次の書式のように「add_data()メソッド」と「set_categories()メソッド」にて対応します。

Chartオブジェクト

グラフにデータ(項目名)を設定

Chartオブジェクト.add_data(data, titles_from_data)メソッド


引数1: data : データの参照情報(Referenceオブジェクト)を設定する

引数2: titles_from_data: 先頭のデータを項目名にするかどうか

(True(系列名にする)/False(しない))


グラフにカテゴリを設定

Chartオブジェクト.set_categories(data)メソッド


引数: data : カテゴリ(系列)の参照情報(Referenceオブジェクト)を設定する

2つのメソッドの引数dataには、セルの参照情報であるReferenceオブジェクトを設定します。

(詳細は後述)

また、add_data()メソッドの引数titles_from_dataには、参照元の各列の先頭要素を系列名とする場合には「True」と指定します。デフォルトは「False」(系列名として引用しない)です。(図8参照)

(Seriesオブジェクトについては後述します。)


また、Chartオブジェクトには「series」という極めて重要な属性があります。対象となるグラフのすべての系列情報をまとめたSeriesコレクションを返します。

インデックス指定で所望の系列情報(Seriesオブジェクト)を個別に取得できます。また、SeriesコレクションはイテラブルなオブジェクトのためFor-in構文で個別要素を取得することもできます。

また、追加の際はappend()関数にて、追加するSeriesオブジェクトを引数に指定します。

Chartオブジェクト

グラフから系列(コレクション)を取得

Chartオブジェクト.seriesプロパティ


戻り値:Seriesコレクション

[index]インデックス指定で個別Seriesオブジェクトの取得ができる


グラフに系列(個別)を追加

Chartオブジェクト.series.append(series)メソッド


引数: series : 追加する系列データ情報(Seriesオブジェクト)を追加する

その他にも、図4、5のようにグラフにはタイトルや凡例・X,Y軸などのような構成要素があります。

これらはChartオブジェクト配下の各種属性(プロパティ)を使って設定・取得ができます。

主たるもの以下<表1>にまとめました。

Chartオブジェクト.属性名機能その他・関連オブジェクト
titleプロパティグラフのタイトルを取得・設定する
styleプロパティグラフのスタイルを取得・設定する整数で指定
legendプロパティ凡例の有効・無効を設定するNoneで無効(デフォルトは有効)
y_axisプロパティy_axisオブジェクト(Y軸)を取得するy_axisオブジェクトの主な属性
titleプロパティ(Y軸のタイトルを設定/取得する)
crossAxプロパティ(X軸との交差値を設定する)
x_axisプロパティx_axisオブジェクト(X軸)を取得するx_axisオブジェクトの主な属性
titleプロパティ(X軸のタイトルを設定/取得する)
number_formatプロパティ(X軸の書式を設定する)
dLblesプロパティデータラベル(DataLabelListオブジェクト)を設定するfrom openpyxl.chart.label import DataLabelList
DataLabelList(showVal=True)
seriesプロパティSeriesコレクション(Seriesオブジェクトのコンテナ)
を取得する
Seriesコレクションの主なメソッドなど
append()メソッド(コレクションに追加する)
・インデックス指定でSeriesオブジェクトを取得する
表1 Chartオブジェクトの主な属性

タイトル、スタイル、凡例などの属性はChartオブジェクト直下の階層で設定・取得できます。

一方、X軸/Y軸/系列はさらに、そこから各オブジェクトを取得した後、その配下の属性を繋げます。

以上が、押さえるべくChartオブジェクトの仕様になります。

2.2 セル範囲の参照情報(Referenceオブジェクト)

グラフのデータやカテゴリの参照元の情報を管理するのが、Referenceオブジェクトです。

どのようなタイプのグラフであったとしても、このReferenceオブジェクトを通じてプロットします。

Referenceオブジェクトは次の書式のようにしてセルの参照範囲(アドレス)を指定します。

Referenceクラス

from openpyxl.chart import Reference

Reference(worksheet, min_colmin_row, max_col, max_row, range_string)


引数1: worksheet : 参照するWorksheetオブジェクトを指定する(デフォルト:None)

引数2: min_col : 参照元の列番号(先頭)を整数で指定する(デフォルト:None)

引数3: min_row : 参照元の行番号(先頭)を整数で指定する(デフォルト:None)

引数4: max_col : 参照元の列番号(末尾)を整数で指定する(デフォルト:None)

引数5: max_row : 参照元の行番号(末尾)を整数で指定する(デフォルト:None)

引数6: range_string : 参照元のアドレス範囲を文字列で指定する(デフォルト:None)

戻り値:Referenceオブジェクト

書式について補足すると、セルの参照範囲の指定には2通りの方法があります。

第2~5引数で行と列番号で指定する方法(図11参照)と、第6引数で文字列(例えば‘A1:C3’)で指定する方法の2つです。

前者の場合は、“A1”セルを基準に1行、1列番目となりますので注意してください。

また、Chartオブジェクトのadd_data()メソッド引数titles_from_dataを有効(True)にした場合は各列の先頭行の要素()が系列名として認識されますので、あとから系列名を設定する手間を省くことができます。

当然ですがその場合は、項目名のセル範囲もあわせて参照領域指定するようにします。

例えば、図11のテーブルであればE4~H4は系列名としたいので、E4~H4も含めて参照します。

Python_Referenceオブジェクトの参照領域_rev0.2
図11 Referenceクラスの引数指定

※引数titles_form_dataで系列名を指定できるのはあくまで先頭行の要素です、先頭列ではありませんので、テーブルは図11のような配置にしておかなければなりません。

2.3 系列データ(Seriesオブジェクト)

個々の系列データは、以下の書式で取得するSeriesオブジェクトとして扱います。

第1~3引数にはそれぞれY軸、X軸、Z軸が参照するセル範囲情報(Referenceオブジェクト)を指定します。なお、第3引数:zvaluesはバブルチャートなど3次元での表現を必要とする場合にのみ使用します。

また、系列名は第4引数:titleに直接文字列で指定するか、もしくは第5引数:title_frome_dataで引数valuesの先頭行の要素を系列名にする場合は”True”とします。(add_data()メソッドと同様)

Seriesクラス

from openpyxl.chart import Series

Series(values, xvalues, zvalues, title, title_from_data)


引数1: values : Y軸の参照データ(Referenceオブジェクト)を指定する

引数2: xvalues: X軸の参照データ(Referenceオブジェクト)を指定する(デフォルト:None)

引数3: zvalues : Z軸の参照データ(Referenceオブジェクト)を指定する(デフォルト:None)

引数4: title: 系列名を指定する(デフォルト:None)

引数5: title_from_data : Y軸の参照範囲の先頭データを系列名に指定する(デフォルト:False)

戻り値:Seriesオブジェクト

Excelの系列の編集ウィンドウと各引数との関係は図12のようになります。

Seriesクラスの引数
12 Seriesクラスの引数指定

Seriesオブジェクトの配下には、数多の属性やオブジェクトが関連し合うツリー構造を持っています。

各系列ごとに指定できるマーカー(Markerオブジェクト)や線(Lineオブジェクト)、ラベルといった要素は対応するSeriesオブジェクトから取得します。

主要なものを<表2>にまとめました。

python_Seriesオブジェクトの階層構造rev0.1
図 Seriesオブジェクトの階層構造を追加
Seriesオブジェクト.属性名機能その他・関連オブジェクト
markerプロパティMarkerオブジェクトを取得する表3を参照
graphicalProperties.lineプロパティLineオブジェクトを取得する表4を参照
smoothプロパティ滑らかな線を描画するTrue(有効)/False(無効)
labelsプロパティデータラベルを設定するDataLabelListオブジェクト
data_pointsプロパティポイントデータを設定するリスト又はappendメソッドで追加
表2 Seriesオブジェクトの主な属性

Seriesオブジェクトについては以上となりますが、Seriesオブジェクト配下の主要なオブジェクトとして「Markerオブジェクト」と「Lineオブジェクト」を以降で紹介します。

その他の、属性・オブジェクトは各グラフタイプの解説時に必要に応じて紹介することにします。

2.3.1 マーカー(Markerオブジェクト)

折れ線グラフにマーカーを配置するには、Seriesオブジェクトの「marker属性」からMarkerオブジェクトを取得した後、さらにその配下の属性にて詳細設定を行います。

次の<表3>はマーカーの形状(シンボル)や色、サイズといった主要な属性の一覧です。

Markerオブジェクト.属性機能その他・関連オブジェクト
symbolプロパティマーカーの形状を設定する例(’triangle’ ,‘plus’, ‘diamond’等など)
sizeプロパティマーカーのサイズを設定する例(7.0など浮動小数点)
graphicalProperties.solidFillプロパティマーカーの塗り潰しFF0000などのRGB指定の他、ColorChoiceオブジェクトにより設定できる
graphicalProperties.line.solidFillプロパティマーカーの枠線の色FF0000などのRGB指定の他、ColorChoiceオブジェクトにより設定できる
表3 Markerオブジェクトの主な属性

symbol属性に指定するマーカーの形状は {‘plus’, ‘diamond’, ‘square’, ‘dash’, ‘dot’, ‘x’, ‘auto’, ‘circle’, ‘star’, ‘picture’, ‘triangle’} の中から選択します。

また、マーカの内部の塗り潰しや枠線の設定にはさらにgraphicalProperties属性line属性を繋げていきます。Lineオブジェクトについてはこの後、解説します。

Excelのマーカー設定ウィンドウと各属性の対応関係を図13に示します。

Python_Markerオブジェクト_rev0.2
図13 Markerオブジェクトの属性指定

2.3.2 ライン(Lineオブジェクト)

openpyxlでは「折れ線グラフのライン」や「その他グラフの枠線(エッジ)」の色や幅、線種などに関連する情報はLineオブジェクトとして管理されています。

LineオブジェクトはSeriesオブジェクトから「graphicalProperties属性」「line属性」の階層順で取得します。

また、先のマーカの場合がそうであったように、対象となるオブジェクトによってはさらに深く属性が縦続します。ただし、Lineオブジェクト以下の属性は、親オブジェクトによらず全て共通しているようです。主要なものを<表4>にまとめました。

、もしくはutilモジュールで単位変換する

Lineオブジェクト.属性機能その他・関連オブジェクト
solidFillプロパティ線の色を設定する“00AAAA”などRGB指定の他ColorChoiceオブジェクトで設定
dashStyleプロパティ線の種類を設定する“sysDot”など規定値を指定する
widthプロパティ線の太さを設定するEMUsもしくはutilモジュールで単位変換して設定
noFillプロパティ線をなくすTrue(有効)/False(無効)
表4 Lineオブジェクトの主な属性

線の種類は「dashStyle属性」で指定しますが、組込みスタイルとして{‘sysDashDot’, ‘dashDot’, ‘sysDash’, ‘dash’, ‘dot’, ‘lgDashDotDot’, ‘lgDashDot’, ‘sysDot’, ‘sysDashDotDot’, ‘solid’, ‘lgDash’}が用意されています。

Lineオブジェクトには図14のように、これ以外にも数多くの設定可能な項目があります。(ほとんど、デフォルト設定のままで問題ありません)

詳細は割愛しますので、より細かい指定をしたい場合は以下の公式ドキュメントなどを参考にして下さい。(基本的な適用方法は類似しています。

公式ドキュメント<openpyxl.drawing.line module>

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.drawing.line.html#openpyxl.drawing.line.LineProperties
Lineオブジェクトの概要
図14 Lineオブジェクトの属性指定

2.3.3 塗りつぶし効果(Fillオブジェクト)

既に「Marker」や「Line」オブジェクトの塗り潰し効果については<表3表4>でも紹介していますが、いま一度、グラフ要素全般における塗り潰し効果について整理しておきましょう。

塗りつぶしはgraphicalProperties属性から取得したオブジェクトからさらに、次の<表5>のような種類の属性を繋げて適用させます。

GraphicalPropertiesオブジェクト.属性名機能その他・関連オブジェクト
solidFillプロパティ単色で塗り潰し”00AAAA”などのRGB指定の他<ColorChoiceオブジェクト>により設定
pattFillプロパティパターン塗り潰し<PatternFillPropertiesオブジェクト>で設定する
gradFillプロパティグラデーション塗り潰し<GradientFillPropertiesオブジェクト>で設定する
noFillプロパティ塗り潰しなしTrue(有効)/False(無効)
表5 Fillオブジェクトを設定する主な属性

各属性に設定する塗り潰し情報はさらに専用クラスから定義する必要がありますが、リンク先の個別記事のサンプルコード内で随時説明をしています。図 グラフ要素の塗り潰し効果と対応する属性

Python_openpyxl_Fillオブジェクトの種類一覧
図 グラフ要素の塗り潰し効果と対応する属性

3. グラフの種類(Chartオブジェクト)

openpyxlにはExcelで作成できるグラフの全種類のタイプに対応し、各タイプに応じて専用クラスが用意されています。使用頻度の高いタイプを厳選して紹介します。

なお、グラフそのものの説明ではなく、Pythonプログラムでグラフを作成する際のキーポイントや特殊属性(プロパティ)について解説していきます。グラフそのももの説明は各種Excelの専門書を参考にして下さい。

また、それぞれの具体的なプログラムは別記事にて紹介したいと思います。

3.1 折れ線グラフ

X軸(項目名)とY軸(値)の対となるデータをプロット、各プロット間をラインで結ぶグラフでもっとも一般的な形態のグラフです。データの参照方法は、全ての系列情報をReferenceオブジェクトにまとめて一括参照できます。(Seriesオブジェクトによる個別参照も可能です。)

散布図との違いは、X軸の値が各系列で共通の値をとる点にあります。

折れ線グラフを定義するクラスは次のLineChartクラス(平面)LineChart3Dクラス(立体)の2種類が用意されています。

LineChart

折れ線グラフ

from openpyxl.chart import LineChart

Chartオブジェクト = LineChart(marker, smooth)

引数: marker :マーカーの有無を設定する(デフォルトNone) True:マーカー有効/False:マーカー無効

引数: smooth :滑らかなラインを設定する(デフォルトNone) True:有効/False:無効

ほか省略可能な引数は多数,全てオプショナル引数

戻り値:Chartオブジェクト


折れ線(3D)グラフ

from openpyxl.chart import LineChart3D

Chartオブジェクト =  LineChart3D(gapDepth, marker, smooth)

引数: gapDepth :床面の奥行を調整する(デフォルトNone)

引数: marker :マーカーの有無を設定する(デフォルトNone) True:マーカー有効/False:マーカー無効

引数: smooth :滑らかなラインを設定する(デフォルトNone) True:有効/False:無効

ほか省略可能な引数は多数,全てオプショナル引数

戻り値:Chartオブジェクト

Chartオブジェクトの「grouping属性」によってグラフの形態を「“standard”(標準)」、「“stacked”(積み上げ)」,「“percentstacked”(100%積み上げ)」から選択することができます。

各タイプの解説は図15にようになります。

折れ線グラフの種類
図15 折れ線グラフの種類

折れ線グラフの具体的な作成手順を以下の別記事でサンプルコードを追いながら丁寧に解説しています。こちらもあわせてご参照下さい。

3.2 棒グラフ

折れ線グラフと同様にX軸(項目)は各系列で共通の値をとります。よって、データの参照方法は、全ての系列情報をReferenceオブジェクトにまとめて一括参照できます。(Seriesオブジェクトによる個別参照も可能です。)

棒グラフを定義するクラスは次のBarChartクラス(平面)とBarChart3Dクラス(立体)の2種類が用意されています。

BarChart

棒グラフ

from openpyxl.chart import BarChart

Chartオブジェクト = BarChart(gapWidth, overlap)

引数:gapWidth:系列間の間隔を調整する(デフォルト150)

引数:overlap:積み上げの重なり具合の調整(デフォルトNone)

ほか省略可能な引数は多数,全てオプショナル引数

戻り値:Chartオブジェクト


棒(3D)グラフ

from openpyxl.chart import BarChart3D

Chartオブジェクト =  BarChart3D(gapWidth, gapDepth, shape)

引数:gapWidth:系列間の間隔を調整する(デフォルト150)

引数:gapDepth:床面の奥行を調整する(デフォルト150)

引数:shape:バーの形状を指定する(デフォルトNone)

ほか省略可能な引数は多数,全てオプショナル引数

戻り値:Chartオブジェクト

Chartオブジェクトの「type属性」によって棒の向きを「”col”(横棒グラフ)」, 「”bar”(縦棒グラフ)」から選択できます。補足としてtype属性を「”col”」とした場合はX軸とY軸が反転してしまいますので注意しましょう。

Chartオブジェクトの「grouping属性」によってグラフの形態を「”standard”(標準)」,「“stacked chart”(積み上げ)」, 「“percentStacked”(%積み上げ)」の3タイプから選択できます。

また、積み上げタイプの棒グラフであることが前提ですが、Chartオブジェクトには「overlap属性」というものがって、上下の項目棒の横方向の隣接度合いを%(整数)で調整することができます。

各タイプの解説は図16にようになります。

棒グラフの種類
図16棒グラフの種類

棒グラフの具体的な作成手順を以下の別記事でサンプルコードを追いながら丁寧に解説しています。こちらもあわせてご参照下さい。

3.3 散布図/バブル

散布図/バブルチャートが折れ線グラフなどと異なる点はX軸の値が系列ごとに異なる値をとることができる点にあります。(もちろん、すべてのX軸の値を共有にすることも可能です。)

のようなことから、このタイプのグラフは<1.2.2>の作成手順のように系列ごとにSeriesオブジェクトを定義し追加していく必要があります。

ScaterChart

散布図

from openpyxl.chart import ScatterChart

Chartオブジェクト = ScatterChart(scatterStyle)


引数: scatterStyle :散布図の形態を指定する(デフォルトNone)

オプション {‘smoothMarker’, ‘marker’, ‘lineMarker’, ‘smooth’, ‘line’}

戻り値:Chartオブジェクト

ほか省略可能な引数は多数,全てオプショナル引数

BubbleChart

バブルチャート

from openpyxl.chart import BubbleChart

Chartオブジェクト = BubbleChart(bubble3D, bubbleScale, showNegBubbles, sizeRepresents)


引数:bubble3D: 立体で表現の可否の設定(デフォルトNone) True(3D)/False(2D:デフォルト)

引数:bubbleScale: バブルの大きさの設定(デフォルトNone)

引数:showNegBubbles:バルブへの影効果の可否の設定(デフォルトNone) True(有効)/False(無効:デフォルト)

引数:sizeRepresents:バブルサイズへの反映方法を指定(デフォルトNone) {‘area’(バブルの面積), ‘w’(幅)}

戻り値:Chartオブジェクト

ほか省略可能な引数は多数,全てオプショナル引数

タイプの解説は図17にようになります。

散布図には、前節で紹介したmarker属性(マーカー)やsmoth属性(滑らか線)、line属性(直性)を使って、折れ線グラフと同じような活用もできます。

X軸の値(項目)を系列毎に個別設定できるメリットを生かしてより柔軟な折れ線グラフをつくることができます。

散布図_バブルチャートの種類
図17散布図/バブルチャートの種類

散布図・バブルチャートの具体的な作成手順を以下の別記事でサンプルコードを追いながら丁寧に解説しています。こちらもあわせてご参照下さい。

3.4 面グラフ

面グラフは折れ線グラフの線の下側を塗りつぶしたようなグラフであり、生成方法や使う属性も同じになります。

面グラフを定義するクラスも次のAreaChartクラス(平面)とAreaChart3Dクラス(立体)の2種類が用意されています。

AreaChart

面グラフ(平面)

from openpyxl.chart import AreaChart

Chartオブジェクト = AreaChart()

戻り値:Chartオブジェクト

※ ほか省略可能な引数は多数,全てオプショナル引数


面グラフ(立体)

from openpyxl.chart import AreaChart3D

Chartオブジェクト =  AreaChart3D(gapDepth)

引数: gapDepth :床面の奥行を調整する(デフォルト150)

戻り値:Chartオブジェクト

※ ほか省略可能な引数は多数,全てオプショナル引数

Chartオブジェクトのgrouping属性によってグラフの形態を「“standard”(標準)」、「“stacked”(積み上げ)」,「 “percentstacked”(100%積み上げ)」の3つから選択することができます。

各タイプの解説は図18にようになります。

面グラフ
図18 面グラフの種類

3.5 円グラフ

円グラフは単体の系列における各項目(カテゴリ)の割合を円状に表示したグラフです。

各項目(カテゴリ)はトップを0°として時計回りに順番に並びます。

また、円グラフには標準的な形状のものの他に、項目(カテゴリ)を一部抜粋して、その領域のデータにおいてさらに補助円または補助棒グラフを表示させるといったことできます。

前者はPieChartクラスを、後者はProjectedPieChartクラスを使います。

PieChart

円グラフ

from openpyxl.chart import PieChart

Chartオブジェクト = PieChart(firstSliceAng)

引数: firstSliceAng : 円グラフの始まりの角度をTopを0°とした時計回りで指定(デフォルト:0)

戻り値:Chartオブジェクト

※ ほか省略可能な引数は多数,全てオプショナル引数


円グラフ(抜き取り)

from openpyxl.chart import ProjectedPieChart

Chartオブジェクト =  ProjectedPieChart(ofPieType, splitType)

引数: ofPieType : 補助グラフの種類を選択 {‘pie’(円グラフ), ‘bar’(縦棒)}

引数: splitType : 補助グラフの抽出パターンを選択 {‘percent’, ‘cust’, ‘pos’, ‘auto’, ‘val’}

戻り値:Chartオブジェクト

※ ほか省略可能な引数は多数,全てオプショナル引数

Chartオブジェクトの「data_points属性」により円グラフの一部を切り出して、強調表示することができます。

また、ProjectedPieChartオブジェクトの補助円(棒)の選択は「type属性」で設定することができ「”pie”」で補助円、「“bar”」で積み上げ棒グラフとなります。

円グラフ
図19 円グラフの種類

4. まとめ

いかがでしたでしょうか?

Excelを操作する外部ライブラリ「openpyxl」を使用して、グラフ作成の手順と必要なクラスやオブジェクトを中心に解説しました。

そのため、グラフを作成の具体的なプログラムについては掲載していませんでした。

しかしどのようなタイプのグラフであっても大まかな手順は同じで以下のようになります。

➀. Chartオブジェクトを取得する。

➁. データ・カテゴリの参照オブジェクトを取得し、Chartオブジェクトに設定する。

➂. WorkSheetオブジェクトに➁のChartオブジェクトを追加する。

以上の手順をどのようにコードに落とし込んでいくのかを次回解説していきたいと思います。

是非、本記事の内容がopenpyxlでのグラフ作成の一助になれば幸いです。

最後までお読みいただきありがとうございました。

タイトルとURLをコピーしました