【Python×Excel】openpyxlでグラフを作成する方法【概要編】

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

Japanese | English

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

Excelには多くの機能が搭載されておりますので、ひと記事で全てを網羅することはできません。大項目(機能)ごとに分けて連載記事【Python×Excel】としてまとめています。

openpyxl_目次_完結版_rev0.1
図1. 連載【Python×Excel】のコンテンツ一覧

これまでの連載の中で、openpyxlを使う上での必須事項を取り上げています。以降の解説を読み進めていくにはある程度、前提知識を必要としますので関連記事もあわせて参考にして下さい。

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

セルの書式設定(フォントや罫線など装飾)に関しては<連載3,4回目>で解説しています。


さて、【連載7回目】となる今回は「Excelにグラフを挿入する手順」の概要について解説していきます。グラフは、「データの見える化」を行う上で極めて重要な役割を果たします たとえば、月々の売上データをグラフの定型フォーマットにまとめて推移を可視化するといったことはよくあることでしょう。

グラフはExcelの主要機能の一つですから、openpyxlにもグラフの関するクラスやメソッドが多数用意されています。

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

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

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

概要編】となる今回はグラフ作成の手順(フロー)必須クラスの詳細仕様およびオブジェクトの階層構造の解説に焦点を当てます。

実践編】となる次回以降は、「折れ線グラフ」「棒グラフ」「散布図」といったグラフ種別ごとの作成事例とTipsを紹介していきます。


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

この記事で学べること

➀. グラフの構成オブジェクトの種類とその階層構造について把握することができる。

➁. グラフタイプに応じた作成手順(フロー)を理解できる。

  • カテゴリ(X軸)を複数の系列データで共有するタイプのグラフ(折れ線グラフなど)
  • 系列データごとにカテゴリ(X軸)の組合せを定義できるタイプのグラフ(散布図など)

➂. 主要グラフタイプにおけるクラスの仕様と従属プロパティについて理解できる。

  • 折れ線グラフ:LineChartクラス(LineChart3Dクラス)
  • 棒グラフ:BarChartクラス(BarChart3Dクラス)
  • 散布図(バブル):Scatterクラス/BubbleChartクラス ・・・

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

【公式ドキュメント】https://openpyxl.readthedocs.io/en/stable/

それでは、次節よりopenpyxlによる「グラフ作成の基本事項」と「グラフタイプごとの手順(フロー)」について解説をしていきます。

スポンサーリンク

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

Excelには折れ線、棒グラフ、散布図、円・・・といったように様々な使途に最適なグラフを作成できます本節では、openpyxlによるグラフ作成についての「基本的な考え方」と「手順(フロー)」について解説します。

まずは、グラフ作成の基本事項として「用語表現の統一」と「グラフを構成する要素」についてここで整理しておきましょう。

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

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

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

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

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

そして、「項目名」と「系列名」とで一意に決まる、個々の要素が、プロットエリアに【データ】として表示されます。(赤色の枠線内)


さらに、以下(図3)はExcelにおけるグラフの編集ウィンドウ(データの選択)です。左が【系列(シリーズ)】、右が【項目(カテゴリ)】のデータを指し、「編集ボタン」でそれぞれの参照範囲を設定できます。

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

以降では、グラフに関するこれらの前提知識がを元に、具体的な「各種オブジェクトの扱い」と「グラフ作成の手順」について詳しく解説を進めます。

1.1 グラフを構成する要素(オブジェクト)について

グラフを構成する要素には図4のようなものがあります。

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

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

openpyxl_グラフの構成要素_rev0.2
図4. グラフを構成する要素(オブジェクト)

Excelは「Workbook(ブック)」をはじめとして「Worksheet(シート)」「Row(行)/Coloumn(列)」「Cell(セル)」…といったようにクラス(オブジェクト)同士が関係し、階層構造を成しています。<参考:連載1回目>

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

タイトルや凡例などChartオブジェクト直下の属性で設定・取得できる構成要素もありますし、X(Y)軸、系列データのように、オブジェクト間の親子関係を意識する必要の要素もあります。後者は、メソッドや属性(プロパティ)を縦続して取得と設定を行います。

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

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

以上、グラフの概要をご理解いただいたことろで、次項からはグラフ作成の手順(フロー)について解説していきます。

1.2 openpyxlによるグラフ作成のフロー

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

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

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

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

. Worksheetオブジェクトの Chartオブジェクト を追加する

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

「データ」と「カテゴリ」を参照するオブジェクトの定義に関する部分については、目的のグラフの種別(たとえば、折れ線グラフや散布図など)によって2通りの方法があります。

1つ目の方法は、複数の系列データを一括してまとめて参照オブジェクト( Referenceオブジェクト )を定義するものです。すべての系列において、共通の項目(X軸)を共有するタイプのグラフに適用することができます。(例えば、折れ線グラフ、棒グラフなど)

2つ目の方法は、個々の系列データごとに、項目(X軸)の参照データとY軸の参照データ、それぞれの Referenceオブジェクト を定義して、Seriesオブジェクト にまとめることもできます。

つまり、系列ごとに、異なる項目(X軸)の値を指定することができるタイプのグラフに適用することができます。(散布図、バブルチャートなど)

もちろん、すべての系列において同じ項目(X軸)の値を参照することができるので、すべてのグラフタイプに対応できます。図6 データとカテゴリを参照するオブジェクト

openpyxl_グラフ作成手順のタイプ別使い分け表_rev0.2
図6. データとカテゴリを参照するオブジェクト

以上、データの参照情報を管理する ReferenceオブジェクトSeriesオブジェクト の2つがあることを踏まえて、次項よりグラフ作成の手順について解説を進めます。

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

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

グラフ作成の手順は図7のようになります。

図7. グラフ作成の手順(系列をまとめて一括参照)

図7のブロック(~)について解説します。

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

Chartオブジェクト はグラフ本体(フレームワーク)となります。

グラフのタイプごとに専用のクラスが用意されています。例えば、「折れ線グラフ」であればLineChartクラス からLineChartオブジェクトを取得します。

.Chartオブジェクトにグラフの要素を追加する

グラフを構成する要素には、タイトル、凡例、軸のタイトルなどがあります。

これらは、Chartオブジェクト 配下の属性(プロパティ)によって追加・設定します。

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

グラフが参照するセル範囲を Referenceオブジェクト として定義します。参照するセル範囲は、「系列名を含めたデータ領域」と「項目名」の2つです。(図8) Referenceクラス は<2.2項>を参照願います。

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

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

➂で定義したデータ領域を指す Referenceオブジェクトadd_data()メソッド でChartオブジェクトに追加します。

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

➂で定義した項目名(カテゴリ)を指す Referenceオブジェクトset_categories()メソッド でChartオブジェクトに追加します。

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

グラフの個々の系列データは Seriesオブジェクト として管理されています。マーカーやライン、塗り潰しなどプロットエリア内の装飾効果は、Seriesオブジェクト配下の属性にて設定します。

Seriesオブジェクトは、Chartオブジェクトの seriesプロパティ で取得できます。

.Worksheetにグラフを挿入する

最後にWorksheetオブジェクトの add_chart()メソッド の引数に、これまでに定義してきたChartオブジェクトとグラフの挿入位置を指定してワークシートに挿入します。

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

add_chart()メソッド

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


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

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

1.2.2 系列ごとに参照オブジェクトを定義する

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

各系列ごとに項目(X軸のデータ)とそれに対応する値(Y軸のデータ)とを組合わせて Seriesオブジェクト

として管理します。(X軸、Y軸のそれぞれの値は、同様に Referenceオブジェクト として定義します。)

グラフ作成の手順は図9のようになります。

openpyxlによるグラフの作成フロー_系列データ個別取得_rev0.3
図9. グラフ作成の手順(系列ごとにオブジェクトを定義)

先の<1.2.1項>「複数の系列をまとめて参照する」の手順と異なるブロックのみを以降で解説します。

.系列データごとに参照情報を定義する

系列ごとに異なる項目(X軸の値)を指定できるので、系列ごとに「X軸の値の参照データ」と「Y軸の値の参照データ」を Referenceオブジェクト で定義します。(-1, -2)

個々の系列データは、Series クラス でX軸とY軸の「Referenceオブジェクト」と系列名で紐づけられSeriesオブジェクト にまとめられます。(-3)

グラフ(Chartオブジェクト)のすべての系列データは、Seriesコレクションで管理されます。series.append()メソッド でコレクションに追加します。(-4)

.は系列ごとに繰り返す必要があるので、For文やWhile文などで繰り返し処理を実行します。

なお、Seriesクラス/コレクションについてはこの後<2.3項>で解説します。

次の図10はExcelの「系列の編集ウィンドウ」で系列を追加している様子です。系列ごとに「系列名」「系列Xの値(X)」「系列Yの値(Y)」の参照範囲を設定していますが、これと同じことをSeriesオブジェクトの取得の際にも行われます。

Seriesオブジェクトの参照イメージ図
図10. 系列の編集ウィンドウとSeriesオブジェク

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

以上、「グラフの構成オブジェクト」と「openpyxlによるグラフ作成手順」についてでした。以降の節からは、各種クラスや属性の仕様についてまとめます。

スポンサーリンク

2. グラフの構成要素(オブジェクト)

Python_基本文法_内包表記

ここまでは、グラフを構成するオブジェクトのレイヤー構造<1.1項>やグラフの作成手順(フロー) <1.2項>について概要を解説してきました。

本節では、グラフ作成で必要となるクラスの詳細仕様についてあらためて紹介します。また、配下の主要な「オブジェクト」「メソッド(属性)」についても解説します。

2.1 グラフ本体(Chartオブジェクト)について

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

たとえば、一般的な「折れ線」であれば次のように LineChartクラス からChartオブジェクトを取得します。その他の、グラフのChartクラスについては<3.項>で紹介します

LineChartクラス(折れ線グラフ)

<折れ線グラフ>

from openpyxl.chart import LineChart

LineChart(marker, smooth)


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

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

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

戻り値: Chartオブジェクト

次項では、Chartオブジェクトに「データを設定するメソッド(属性)」やタイトルや軸の設定など「グラフの構成要素を追加・設定する属性」について個別に解説します。

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

はじめに、プロットするデータ(系列名や項目名を含む)を設定するメソッド・属性についてです。<1.2項>で解説したとおり、各系列の項目(X軸)の共有方法によって2とおりのデータ設定があるのでした。

項目を共有するタイプのグラフにデータを設定するには add_data()メソッド を、項目名を設定するには set_categories()メソッド を次の書式にようにして使います。

add_data() / set_categories()

<データ(Yの値)を設定>

Chartオブジェクト.add_data(data, titles_from_data)


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

引数2: titles_from_data: 先頭のデータをカテゴリ(系列名)にするかどうかを選択する

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

<項目(Xの値)を設定>

Chartオブジェクト.set_categories(data)


引数: data : 項目名の参照情報(Referenceオブジェクト)を設定する

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

(詳細は後述)

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


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

インデックスを指定して所望の系列情報(Seriesオブジェクト)を個別に取得できます。また、SeriesコレクションはイテラブルにFor-in構文などで、シーケンシャルに個々のオブジェクトを取得することもできます。(Seriesオブジェクトについては後述します。)

コレクションに新たなSeriesオブジェクトを追加するには、コレクションに対して append()メソッド を実行します。

seriesプロパティ / Seriesコレクション.append()

<系列(コレクション)の取得>

Chartオブジェクト.series

戻り値: Seriesコレクション

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


<系列(個別)の取得>

Chartオブジェクト.series[index]

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

戻り値: Seriesオブジェクト


<系列(個別)を追加>

Chartオブジェクト.series.append(series)

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

以上が、Chartオブジェクトにデータ(系列データ)を設定/取得するメソッドになります。

2.1.2 Chartオブジェクトに構成要素を追加・設定する

グラフには、「タイトル」や「凡例」「X,Y軸」などデータが表示されるプロットエリア以外にも構成要素があります。(図4/5)

これらはChartオブジェクト配下の各種属性(プロパティ)によって設定・取得ができます。主たるものを以下<表1>にまとめました。

Chartオブジェクト.属性名機能その他・関連オブジェクト
titleグラフのタイトルを取得・設定する
styleグラフのスタイルを取得・設定する整数で指定
legend凡例の有効・無効を設定するNoneで無効(デフォルトは有効)
y_axisy_axisオブジェクト (Y軸)を取得するy_axisオブジェクトの主な属性
titleプロパティ(Y軸のタイトルを設定/取得する)
crossAxプロパティ(X軸との交差値を設定する)
x_axisx_axisオブジェクト (X軸)を取得するx_axisオブジェクトの主な属性
titleプロパティ(X軸のタイトルを設定/取得する)
number_formatプロパティ(X軸の書式を設定する)
seriesSeriesコレクションを取得するSeriesオブジェクトの主な属性
markerプロパティ(マーカーを設定する)
graphicalPropertiesプロパティ(色やラインの設定をする)
表1. Chartオブジェクト配下の属性(タイトル・凡例・軸の設定)

タイトル(title)、スタイル(style)、凡例(legend)などの要素は、Chartオブジェクト直下の属性レイヤーで設定と取得ができます

一方、軸(X/Y)、系列については上記属性で各オブジェクトを取得した後に、さらに配下の属性レイヤーを掘り下げてアクセスします。(図11)

openpyxl_Chartオブジェクト_X_axisオブジェクト_Y_axisオブジェクト_rev0.2
図11. x_axis/y_axisオブジェクトの属性

プロットエリアの要素である「系列」や「マーカ」「ラベル」「ライン」などはSeriesオブジェクト配下の属性にて対応します。<2.3項>Seriesオブジェクトで解説します。

以上、Chartオブジェクトについて「データを設定するメソッド」と「構成要素を追加・設定する属性」について紹介しました。

2.2 セルの参照情報を管理する(Referenceオブジェクト)

グラフのデータ(系列名を含む)や項目(カテゴリ)などのセル範囲の参照情報は、Referenceオブジェクトで管理されます。Referenceオブジェクトは次の書式のようにして取得します。

セルの参照範囲の指定には2通りの方法があります。

第2~5引数に行番号と列番号を指定する方法(図12参照)と、第6 引数:range_string で文字列(例えば‘A1:C3’)で指定する方法の2つです。前者の場合は、“A1”セルを基準に1行、1列番目となりますので注意してください。

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オブジェクト

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

また、Chartオブジェクトの add_data()メソッド引数:titles_from_data を”True”‘(有効)とした場合は先頭行の要素(※)が系列名として認識されます。例えば図12のテーブルであれば、“D4~G4”が系列名となります。

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

2.3 系列データを管理する(Seriesオブジェクト)

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

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

また、系列名は 第4引数:title に直接文字列で指定するか、もしくは 第5引数:title_from_data   を“True”とすることで、引数valuesの先頭行の要素を系列名にできます。(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の系列の編集ウィンドウと各引数との関係は図13のようになります。

Seriesクラスの引数
13. Seriesクラスの引数指定

Seriesオブジェクトの配下には、多くの属性や関連(子)オブジェクトが連なるツリー構造を持ちます。図14のように、グラフのプロットエリアに関連する、マーカー(Markerオブジェクト)や線(Lineオブジェクト)ラベルといった個別要素の設定や取得ができます。

openpyxl_Seriesオブジェクトの階層構造rev0.2
図14. Seriesオブジェクトの階層構造を追加

Seriesオブジェクトの配下の主要属性を<表2>にまとめました。

Seriesオブジェクト.属性名機能その他・関連オブジェクト
markerMarkerオブジェクト を取得する表3を参照
graphicalProperties.solidFillFillオブジェクト を取得する表5を参照
graphicalProperties.lineLineオブジェクト を取得する表4を参照
smooth滑らかな線を描画するTrue(有効)/False(無効)
labelsデータラベルを設定するDataLabelListオブジェクト
data_pointsポイントデータを設定するリスト又はappendメソッドで追加
表2 Seriesオブジェクトの主な属性

Seriesクラス(オブジェクト)のについては以上です。以降ではSeriesオブジェクト配下の主要オブジェクトである「Markerオブジェクト」と「Lineオブジェクト」「Fillオブジェクト」を紹介します。

その他の、属性については個各のグラフタイプの解説時に紹介することにします。

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

折れ線グラフなどのマーカーは、Seriesオブジェクト配下の Markerオブジェクト で管理されています。Markerオブジェクトは、marker属性 から取得することができます。以下<表3>のようにMarkerオブジェクトには、マーカーの形状(シンボル)や色、サイズを設定・取得できる多くの属性が用意されています。

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のマーカー設定ウィンドウと各属性の対応関係を図15に示します。

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

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

openpyxlでは「折れ線のライン」や「マーカー等の枠線(エッジ・縁取り)」の色や幅、線種などに関する情報は Lineオブジェクト として管理されています。

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

また、先のマーカの場合のように、対象とするオブジェクト(Markerオブジェクト等)に対して、graphicalProperties属性を繋げる場合もあります。ただし、Lineオブジェクト以下の属性は、親オブジェクトによらず全て共通しています。主要な属性を以下<表4>にまとめました。

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’} が用意されています。

線の色や太さは solidFill属性 width属性 で設定します。noFill属性 で線を非表示にすることもできます。

Lineオブジェクトには、これ以外にも数多くの設定可能な項目があります。図16はExcelの線の設定ウィンドウですが、始点や終点の形状やサイズなどの属性も用意されています。

詳細は割愛しますので、より細かい指定をしたい場合は以下の公式ドキュメントなどを参考にして下さい。

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

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

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

すでに「Marker」や「Line」オブジェクトを単色で塗り潰すための属性として「solidFill」(表3,4)について紹介していますが、塗り潰し効果は「単色」だけでなく「パターン(模様)」「グラデーション(階調)」を適用することもできます。

塗りつぶしは、対象オブジェクト配下の graphicalProperties属性 から、更に目的の効果(単色・パターン・グラデーション)となる属性を繋げることで適用します。まとめると次の<表5>のようになります。

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

各属性へは、塗り潰し情報を定義する専用クラスからオブジェクトを取得し設定します。パータン効果であれば PatternFillPropertiesオブジェクト を、グラデーション効果であれば GradientFillPropertiesオブジェクト を定義し設定します。

図17は、Excelの塗り潰し設定ウィンドウと各属性の関係を示します。

具体的な設定方法については、各グラフの個別記事の中でサンプルコード内で随時解説します。

Python_openpyxl_Fillオブジェクトの種類一覧
図17. Excelの塗り潰し設定ウィンドウと対応する属性の関係

以上、グラフの構成する個別オブジェクトについて解説しました。次項ではopenpyxlが提供するグラフ機能の種類にはどのようなものがあるのか、グラフの本体(フレームワーク)であるChartオブジェクトについて紹介します。

スポンサーリンク

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

openpyxlは、Excelで作成できる全タイプのグラフに対応しています。各タイプごとに専用のクラスが用意され、グラフ本体(フレームワーク)がChartオブジェクトで管理されます。

本節では、代表的なグラフタイプのChartクラスの紹介と各Chartオブジェクトにおける特殊プロパティやキーポイントについて解説します。(グラフそのものの解説はExcelの専門書に譲ります。)

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

3.1 折れ線グラフ

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

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

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

LineChartオブジェクト

<折れ線グラフ>

from openpyxl.chart import LineChart

LineChart(marker, smooth)

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

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

ほか省略可能な引数は多数存在します

戻り値: LineChartオブジェクト


<折れ線(3D)グラフ>

from openpyxl.chart import LineChart3D

LineChart3D(gapDepth, marker, smooth)

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

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

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

ほか省略可能な引数は多数存在します

戻り値: LineChart3Dオブジェクト

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

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

折れ線グラフの種類
図18. 折れ線グラフの種類

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

3.2 棒グラフ

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

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

BarChartオブジェクト

<棒グラフ>

from openpyxl.chart import BarChart

BarChart(gapWidth, overlap)

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

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

ほか省略可能な引数は多数存在します

戻り値: BarChartオブジェクト


<棒(3D)グラフ>

from openpyxl.chart import BarChart3D

BarChart3D(gapWidth, gapDepth, shape)

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

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

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

ほか省略可能な引数は多数存在します

戻り値: BarChart3Dオブジェクト

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

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

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

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

棒グラフの種類
図19. 棒グラフの種類

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

3.3 散布図/バブル

散布図(バブルチャート)は、X軸の値(項目名)を各系列ごとに異なる値をとれる点が、折れ線グラフなどと異なります。(もちろん、すべて系列で同じ項目名を参照しても問題ありません。)

このようなことから、散布図は<1.2.2項>の作成手順のように系列ごとにSeriesオブジェクトを定義する必要があります。

散布図は ScatterChartクラス 、バブルチャートは BubbleChartクラス からChartオブジェクトを取得します。

ScaterChartオブジェクト

<散布図>

from openpyxl.chart import ScatterChart

ScatterChart(scatterStyle)


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

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

戻り値: ScatterChartオブジェクト

ほか省略可能な引数は多数存在します

BubbleChartオブジェクト

<バブルチャート>

from openpyxl.chart import BubbleChart

BubbleChart(bubble3D, bubbleScale, showNegBubbles, sizeRepresents)


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

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

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

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

戻り値: BubbleChartオブジェクト

ほか省略可能な引数は多数存在します

グラフの形態には図20のようなものがあります。

散布図は、Markerオブジェクトによるプロット以外にも、line属性(直線)、smoth属性(滑らか線)を使って、線で結ぶこともできます。

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

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

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

3.4 面グラフ

面グラフは折れ線の下部を塗りつぶしたグラフであり、生成方法や使う属性も類似しています。

面グラフを定義するためのクラスも、AreaChartクラス(平面)と AreaChart3Dクラス(立体)の2種類があります。

AreaChartオブジェクト

<面グラフ(平面)>

from openpyxl.chart import AreaChart

AreaChart()

戻り値: AreaChartオブジェクト

※ ほか省略可能な引数は多数存在します


<面グラフ(立体)>

from openpyxl.chart import AreaChart3D

AreaChart3D(gapDepth)

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

戻り値: AreaChart3Dオブジェクト

※ ほか省略可能な引数は多数存在します

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

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

面グラフ
図21. 面グラフの種類

3.5 円グラフ

円グラフは、項目(カテゴリ)の割合を円状に表示したグラフです。各項目(カテゴリ)はトップを0°として時計回りに順番に並びます。

標準的な円グラフは Piechartクラス にて定義できる他、項目を一部抜粋して、さらに補助円や補助棒グラフを表示できる ProjectedPieChartクラス があります。

PieChartオブジェクト

<円グラフ>

from openpyxl.chart import PieChart

PieChart(firstSliceAng)

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

戻り値: PieChartオブジェクト

※ ほか省略可能な引数は多数存在します


<円グラフ(抜き取り)>

from openpyxl.chart import ProjectedPieChart

ProjectedPieChart(ofPieType, splitType)

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

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

戻り値: ProjectedPieChartオブジェクト

※ ほか省略可能な引数は多数存在します

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

また、ProjectedPieChartオブジェクトtype属性 で補助円(棒)の選択ができ「”pie”」で補助円、「“bar”」で積み上げ棒グラフとなります。各タイプの解説は図22にようになりま

円グラフ
図22. 円グラフの種類

4. まとめ

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

Excelを操作する外部ライブラリ「openpyxl」で、グラフを作成する手順と必要なクラス(オブジェクト)についてまとめました。

openpyxlライブラリのchartモジュールには、グラフを操作するための多くのクラスが用意されていますが、今回紹介したものは、必ずマスタすべき必須Tipsとなります。

また、今回は具体的なプログラムについて掲載していませんが、どのようなタイプのグラフであっても手順の概要は以下のようになります。

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

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

  • すべての系列で同じ項目を共有するタイプ
    • すべての系列をまとめた Referenceオブジェクト を設定する
  • 個々の系列で、ことなる項目を採るタイプ
    • 系列ごとに Seriesオブジェクト を定義し設定する

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

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

データの可視化にグラフは欠かせません。

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

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

Japanese | English

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