Pythonライブラリ(openpyxl)によるExcel「棒(縦棒・横棒)グラフ」の作り方とデザインレシピ【徹底解説】

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

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

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

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

前回の連載7回目の記事では、openpyxlによるグラフの作成方法の基本的な手順と種類、そして主要なクラスやオブジェクトを紹介してきました。

今回の記事からはグラフの作成の手順をサンプルコードを使ってより具体的に解説していきます。

実際のコードを追うことで、前回の【概要編】で解説した「グラフ作成における一連の流れ」や「グラフを構成するオブジェクトの階層構図」「各種属性について」といったことをより深く理解することができるでしょう。

openpyxlを使うことで、驚くほど簡単に実用的なグラフを描画できることを実感してみてください。


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

➀. 折れ線・棒グラフといった系列ごとに同じ項目(カテゴリ)を共有するタイプのグラフの作り方が分かる。

➁. 棒グラフ(BarChart)の詳細なコード解説により、「グラフ全体の構成要素の追加・設定」や「棒グラフの形態や特殊な属性」「プロットエリアの系列データ(Seriesオブジェクト)の装飾」といったことが分る。

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

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

スポンサーリンク

1. グラフ作成の手順

oenpyxlでグラフ作成をする手順について解説します。

折れ線、棒グラフなどの各系列によって同じ項目(X軸)を共有するようなグラフのタイプでは、複数の系列データをまとめて一括参照することができます。この場合のグラフ作成のフロー全体を体系化したのが図2になります。

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

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

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

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

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

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

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

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

python_Referenceオブジェクトの参照領域(データ領域_項目名領域)_rev0.2
図3 系列データと項目(系列)の参照セル範囲(Referenceオブジェクト)

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

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

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

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

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

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

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

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

以上がグラフ作成の手順となります、次節より具体的なコード例を交えながら詳細に解説していきます。今回は、数多くあるグラフの中から「棒グラフ(BarChart)」を取り上げます。

2. 棒/横棒グラフについて

Python_基本文法_内包表記

X軸(項目名)とY軸(値)の対となるデータで値の絶対量をバー(棒線)で表現し、項目間、系列間の比較が容易で一般的に良く使われる形態のグラフです。データの参照方法は、全ての系列情報を含むデータをReferenceオブジェクトに一括にまとめます。

同じようなグラフに散布図がありますが、違いはX軸の値(カテゴリ)を各系列で共通するデータを参照する点にあります。

棒グラフを提供するクラスは、グラフの次数により区別され平面(2D)はBarChartクラスと立体(3D)はBarChart3Dクラスの2種類が用意されています。

BarChart

棒グラフ

from openpyxl.chart import BarChart

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

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

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

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


棒(3D)グラフ

from openpyxl.chart import BarChart3D

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

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

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

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

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

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

さらに、type属性によりバーを積む方向を「“col”(縦方向)」、「“bar”(横方向)」で指定することができます。

棒グラフの次数とそれぞれの形態・バーの向きとそれぞれの特徴は図4に示すとおりですので参照してください。

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

プロットエリアの構成要素には、バー(棒)がありますが、内部を任意のパターンで塗り潰す、間隔の調整やラベルを付与するといったことができます。

これらは、系列ごとにSeriesオブジェクトとして管理されています。

ここまでが、棒グラフ(BarChart(3D)オブジェクト)の概要となります。次項より具体的なサンプルコードを示しながらグラフの作成手順を解説していきます。

3. 棒グラフ(平面:BarChart)のサンプルコード

それでは、次のような仕様をもつ棒グラフのサンプルコードを幾つかのListに分けて順番に紹介していきます。

<サンプルコードの仕様>

系列を3つ、項目を4つのデータを参照する「棒(縦)グラフ」とする

メインタイトルと軸の(サブ)タイトルをもつ

凡例をグラフの下側に配置する

特定の系列のカテゴリを指定してパターンを設定する

バーにデータラベルを配置する

3.1 棒グラフの概要定義

はじめに、必要なクラスのインポートから、グラフ本体となるBarChartオブジェクト、それからタイトルや凡例などグラフの構成要素を取得しているのが次の<List1>になります。

# モジュール・クラス群のインポート-------------------------------------------

from openpyxl import load_workbook

# 棒グラフ作成(グラフ本体、データ参照情報の定義)に必要となるクラス
from openpyxl.chart import BarChart, Reference, Series

# パターン(模様)塗り潰しに必要なクラス
from openpyxl.drawing.fill import PatternFillProperties, ColorChoice

# 個別データ(項目名・カテゴリ名)情報の定義に必要なクラス
from openpyxl.chart.marker import DataPoint

# データラベル情報の定義に必要なクラス
from openpyxl.chart.label import DataLabel, DataLabelList

# ファイル(シート)読込--------------------------------------------------------

wb = load_workbook('Graph_DataSource.xlsx')  # Excelファイル(元データ)の読込み
ws = wb.worksheets[0]                        # Worksheetオブジェクトの取得


# [A] グラフ本体と構成要素の準備 ----------------------------------------------

# Chartオブジェクト(棒グラフの本体)を取得
c1 = BarChart()


# グラフの大きさを調整する
c1.width = 18     # デフォルト(15cm)
c1.height = 10    # デフォルト(7cm)


# グラフのタイトルを設定(メイン、軸)
c1.title = "Bar Chart"               # メインタイトル
c1.x_axis.title = 'Month'            # X軸のタイトル
c1.y_axis.title = 'Precipitation'    # Y軸のタイトル


# グラフの凡例
c1.legend.position = 'b'     # 凡例の配置位置

#---------------------------------------------
# <List2>へ続く

15行目までは、棒グラフの本体機能を提供するBarChartクラスや棒(バー)の装飾(※)に必要となるクラス群をインポートしています。※後半の各系列データの個別設定で使用します。

また、26行目でグラフの本体となるChartオブジェクトを取得しています。これ以降はこのChartオブジェクト配下のメソッドや属性(プロパティ)を使ってグラフを構成していきます。

30/31行目 【サイズ】

グラフの大きさはデフォルトでは(17cm×7cm)で作成ますが、個別に指定することもでき30行目と31行目のwidth/height属性で設定しています。

36/37行目【タイトル】

次にグラフのタイトルの設定を行います。本タイトルは「title属性」で設定します。(35行目)X軸/Y軸のタイトルは各軸のオブジェクトに対して「title属性」で設定します。軸のオブジェクトはx_axis/y_axis属性で取得しますが、コードでは属性チェーン(属性.属性)で一度に設定しています。(36・37行目)

41行目【凡例】

凡例の設定となります。凡例のオブジェクトは「legend属性」にて取得します。デフォルトでは凡例は自動で表示されますが、「legend属性」に“None”を設定することで非表示にすることができます。今回は、さらに「position属性」に“b”を指定してプロットエリアの下側に凡例を配置するようにしています。

ここまでのコードを実行しても図5のようにグラフの枠以外は何も表示されません。次の<List2>でプロットエリアを定義した後に、軸や凡例が反映されます。

Python_グラフエリアのみ生成
図5 <List1>の実行結果

3.2 棒グラフの参照範囲情報の定義

引き続き<List2>ではChartオブジェクトにデータの参照元情報を追加していきます。

(<List1>の続きに<List2>を追記してください)

# [B] データの参照情報を取得する --------------------------------------------------

# データ(系列名を含めた)となるセル範囲の参照オブジェクトを取得
# 3(C)列-5(E)列、4行目-8行目を参照
data = Reference(ws, min_col=3, max_col=5, min_row=4, max_row=8)

# 項目名(カテゴリ)となる列の参照オブジェクトを取得
# 2(B)列、5行目-8行目を参照
category = Reference(ws, min_col=2, max_col=2, min_row=5, max_row=8)

# Chartオブジェクトにデータと項目を設定する
c1.add_data(data, titles_from_data=True)  # 第2引数にTrueを指定して先頭要素を系列名とする
c1.set_categories(category)                # 項目(カテゴリ)を設定

#---------------------------------------------
# <List3>へ続く

まず、5行目では系列名を含めたデータの参照元のセル範囲をReferenceオブジェクトとして定義します。(図6の赤の枠内)そして、9行目では項目名(カテゴリ)となる列のセル範囲を同じく、Referenceオブジェクトとして定義します。

Python_棒グラフのセル範囲の参照情報_List2_rev0.1
図6 <List2>のデータの参照セル範囲(Referenceオブジェクト)

そして、12行目のadd_data()メソッドでデータ情報を、13行目のset_categories()メソッドで項目(カテゴリ)を設定します。また、add_data()メソッドでは、「引数title_from_data」にTrueと設定することでデータのReferenceオブジェクトの先頭行の要素(※)を系列名にするようにしています。

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

3.3 棒グラフの形態と向きの指定

<List2>に続き<List3>を追加します。<List3>では、棒グラフの大まかな形態や

見栄えを整えています。棒グラフ特有の属性設定もあります。

# [C] 棒グラフ(BarChart)の形態タイプと見栄えの設定 -----------------------------

# 棒グラフのテーマカラーの設定
c1.style = 7         # テーマカラーを整数で設定

# バーの向き(縦、横)を設定する
# "col":縦棒グラフ , "bar":横棒グラフ(デフォルトは"col")
c1.type = "col"

# グラフの形態を設定する
# "standard"(標準), "stacked"(積み上げ),"percentStacked"(100%積み上げ)
c1.grouping = "standard"

# カテゴリ集合の間隔を調整する
c1.gapWidth = 200

#---------------------------------------------
# <List4>へ続く
4行目 【テーマカラー】

グラフ全体のテーマカラーは「style属性」にインデックスを設定することで簡単に設定することができます。設定範囲は1~48までとなり、図7のような色合い、グラデーションから選択することができます。

折れ線グラフ(LineChart)のスタイル一覧の結果とは完全に一致はしていませんが、<こちら>も参考にして下さい。

Python_BarChartのスタイル一覧
図7 style属性によるテーマカラー一覧(一部省略)
8行目 【バーの向き】

バーの向きは「type属性」にて設定します。”col”(縦向き)、”bar”(横向き)で指定します。属性設定を省略した場合はデフォルトの“col”(縦向き)が適用されます。後ほど詳しく解説します。

12行目 【グラフの形態】

棒グラフの形態を「grouping属性」にて設定します。

standard“(標準), “stacked“(積み上げ),”percentStacked“(100%積み上げ)から選択できます。後ほど詳しく解説します。

15行目 【カテゴリ集合の間隔】

カテゴリ集合の間隔を調整するには「gapWidth属性」を設定します。整数で0~500まで指定可能で、大きくするほぼ間隔を広げることができます。

図8はgapWidth=200とした例です。

Python_gapWidth属性の解説_rev0.1
図8 gapWidth属性によるカテゴリ集合の間隔調整

3.4 棒グラフの系列の書式設定(1)

<List3>に続き<List4>を追加します。

ここからは、各系列(バー)に装飾を施していきます。

# [D] 各系列ごとにバーの装飾を設定する

# <系列1>のバーの装飾 -----------------------------------------------------------

# Seriesオブジェクトの取得
ser1=c1.series[0]

# 単一色による塗り潰し

# ➀ RGB Hex表記による色指定
# ser1.graphicalProperties.solidFill = "FF0000"

# ➁ ColorChoiceオブジェクトによる指定
ser1.graphicalProperties.solidFill = ColorChoice(prstClr="cornflowerBlue")

# <系列2>のバーの装飾 -----------------------------------------------------------

# Seriesオブジェクトの取得
ser2=c1.series[1]

# パターン(模様)の定義
# (PatternFillPropertiesオブジェクトの定義)

# 【その➀ 属性による指定】
# ➀-1 縦縞模様の塗り潰し
fill =  PatternFillProperties(prst="dkVert")
# ➀-2 foreground属性で前景色を指定(赤)
fill.foreground = ColorChoice(prstClr="red")
# ➀-3 background属性で背景色を指定(青)
fill.background = ColorChoice(prstClr="blue")

# 【その➁引数による指定】
# fill = PatternFillProperties(prst="dkVert", fgClr=ColorChoice(prstClr="red"), bgClr=ColorChoice(prstClr="blue"))


# SeriesオブジェクトのpattFill属性に、パターン定義(PatternFillPropertiesオブジェクト)を設定する
ser2.graphicalProperties.pattFill = fill

#---------------------------------------------
# <List5>へ続く

6行目で、系列1のSeriesオブジェクトを取得します。14行目までは、系列1のバーに対する装飾処理になります。

11, 14行目 【単色塗りつぶし】

11、14行目は、「solidFill属性」によってバー内部を単色で塗りつぶしています。

色は、11行目のように「RGBのHex表記(文字列)」で指定する方法(➀)、または14行目のように「ColorChoiceオブジェクト」を使う方法(②)があります。

一般的な色付けであればどちらでも構わないと思いますが、ColorChoiceオブジェクトには豊富なカラーバリエーションがあるのでそちらを使いたい場合は➁のようにして指定します。

ColorChoiceクラスの書式は以下の通りです。

ColorChoiceクラス

from openpyxl.drawing.fill import ColorChoice

ColorChoice(prstClr, srgbClor, sysClor, schemeClor)


引数:prstClor: 組込みカラーオプションから指定する

(‘cornflowerBlue’, ‘darkCyan’, ‘darkSlateGrey’, ‘darkSlateBlue’,など多数)

引数:srgbClor: RGBの文字列(’FFFFFF’)で指定する

引数:sysClor: SystemColorオブジェクトで指定する

引数:schemeClor: SchemeColorオブジェクトで指定する

戻り値:ColorChoiceオブジェクト

続いて19行目で系列2のSeriesオブジェクトを取得します。以降、30行目までは、系列2のバーに対する装飾処理になります。

最終的には37行目のpattFill属性により、バー内部をパターン(模様)塗りつぶしを適用しますが、その前に、網掛けするパターンの定義情報である(PatternFillpropertiesオブジェクト)を定義しています。

26,28,30,33行目 【網掛けパターンの定義】

PatternFillpropertiesオブジェクトを定義しています。網掛けパターンの種類・前景色・背景色を引数や属性を使って指定します。(➀-1,2,3)

➁は引数指定のみで指定した場合です。どちらもできることは同じです。

PatternFillpropertiesクラスの書式は以下の通りです。

PatternFillpropertiesクラス

from openpyxl.drawing.fill import PatternFillProperties

PatternFillProperties(prst, fgClr, bgClor)


引数:prst: デザインパターンを指定する

(‘dashUpDiag’, ‘narVert’, ‘horz’, ‘smGrid’,・・・など数多のオプション指定)

引数:fgClr: 前景色を指定する

(”FF0000”Hex表記の他、ColorChoiceクラスによる指定も可能)

引数:bgClr: 背景色を指定する

(”FF0000”Hex表記の他、ColorChoiceクラスによる指定も可能)

戻り値:PatternFillPropertiesオブジェクト

3.5 棒グラフの系列の書式設定(2)

<List4>に続き<List5>を追加します。

さらに、系列(バー)に装飾を施していきます。<List4>は系列全体に処理を施しましたが、<List5>は系列の特定の項目(系列)に適用する応用例です。

# [E] 系列3の指定した項目(カテゴリ)のみ装飾を施す

# <系列3>のバーの装飾 -----------------------------------------------------------

# Seriesオブジェクトの取得
ser3=c1.series[2]

# 特定の項目情報はDataPointオブジェクトで管理
# 引数のidxは項目のインデックスをを指定
pt = DataPoint(idx=3)

# DataPointオブジェクトに施す、書式を設定する(この場合は、パターン網掛け)
pt.graphicalProperties.pattFill = PatternFillProperties(prst="ltHorz")

# Seriesオブジェクトに、DataPointオブジェクトを適用する
# 適用する方法は以下の3通りあり、どれでも構わない

#ser3.dPt.append(pt)           # appendメソッドで追加(1)
#ser3.data_points.append(pt)   # appendメソッドで追加(2)
ser3.data_points = [pt]        # リストで設定


# [F] 系列3のバーに「データラベル」を施す-----------------------------------------

# ➀全ての項目(カテゴリ)にラベルを表示する場合
# ➀-1 DataLabelListオブジェクトの取得
#lbl = DataLabelList(showVal=True)

# ➁特定の項目を指定してラベルを表示する場合
# ➁-1 DataLabelオブジェクトを取得する(引数idxは項目のインデクスを指定)
lb = DataLabel(idx=1, showVal=True)
# ➁-2 DataLabelListオブジェクトに追加する
lbl = DataLabelList(dLbl=[lb])

# 系列3のSeriesオブジェクトにラベル(DataLabelListオブジェクト)を設定する

#ser3.dLbls=lbl   # ➂-1
ser3.labels=lbl   # ➂-2


# Chartオブジェクトをシートに追加して保存 -----------------------------------------

ws.add_chart(c1, "B13") # B13セルを左上にグラフを貼り付ける
wb.save('BarChart_example1_standard.xlsx')

6行目で系列3のSeriesオブジェクトを取得します。以降、38行目までは、系列3のバーに対する装飾処理になります。

10,13,20行目 【特定の項目の処理】

10行目では、特定の項目情報を管理するDataPointオブジェクトを、「引数idx」にインデックス指定して取得します。(この例では4つ目の項目データが対象となります。)

13行目では、DataPointオブジェクトに書式を適用しています。(網掛けパターン)

そして、20行目のdata_points属性などで系列3の項目群にセットします。

31,33,38行目 【データラベルの設定】

31行目、個々のラベルはDataLabelオブジェクトで管理されています。引数idx項目番号(インデックス)を、引数showValを“True”としたこの場合、系列3の2番目の項目に「データラベル」を定義したオブジェクトとなります。

33行目で、DataLabelListというコレクションにまとめて、38行目のSeriesオブジェクトの

labels属性に設定することでラベルを指定します。

また、補足として系列のすべての項目に対してラベルを設定する場合は、27行目のようにDataLabelListコレクションからの取得となります。

DataLabelクラス

from openpyxl.chart.label import DataLabel

DataLabel(idx, showVal, showSerName, showPercent)


引数:idx: カテゴリのインデックスを指定する

引数:showVal: ラベルに数値を表示する    True(表示)/False(非表示・デフォルト)

引数:showSerName: ラベルに系列名を表示するTrue(表示)/False(非表示・デフォルト)

引数:showPercent: ラベルに割合(%)を表示する True(表示)/False(非表示・デフォルト)

戻り値: DataLabelオブジェクト


from openpyxl.chart.label import DataLabelList

DataLabelList(dLbl, showVal)


引数:dLbl: DataLabelオブジェクトをリスト形式で指定する(必要な要素分)

引数:showVal:ラベルを設定する場合はTrueを指定する

(但し、Trueを指定した場合すべてのカテゴリに一括表示される個別のカテゴリを指定するには指定しない、もしくはFalse(デフォルト)とする)

戻り値: DataLabelListオブジェクト


サンプルコードの解説は以上となります。<List1>~<List5>をすべて連結、実行した結果は図9のようになりました。タイトルやバーの色、それから特定項目にパターンやデータラベルが表示できできていることが確認できます。

Python_棒グラフ_List1-List5の実行結果
図9 サンプルコード(<List1>~<List5>)の実行結果

4. グラフの種別について<補足>

2章の<図4>のように、棒グラフ(BarChart)は、「バーの向き」と「グラフの種別」を組合わせて描画することができます。これらを設定する属性と適用例を紹介します。

4.1 バーの向き

バーの向きは、type属性によって縦棒“col”もしくは横棒”bar”(横棒)の指定ができます。容易に切り替えることができますが、両者の設定でカテゴリの並びが反転してしまう点には留意しましょう。

<List3>の8行目を<List6>を差し替えることで縦棒から横棒にバーの向きが変更されました。(図10)

# バーの向き(縦、横)を設定する
# "col":縦棒グラフ , "bar":横棒グラフ(デフォルトは"col")
c1.type = "bar"
Python_棒グラフ_type属性_col_bar_rev0.1
図10 type属性によるバーの向きの設定

4.2 グラフの形態

グラフの形態は、grouping属性によって”standard”(標準), “stacked(積み上げ),”percentStacked”(100%積み上げ)の中から選択できます。

<List3>の12行目を<List7>の3行目に差し替えるだけで変更することができます。(図11)

# グラフの形態を設定する
# "standard"(標準), "stacked"(積み上げ),"percentStacked"(100%積み上げ)
c1.grouping = "stacked" # 積み上げ棒グラフ


# 隣接する辺の共有度合いを調整する(積み上げタイプのみ設定が可能)
# 100がデフォルト、小さくするごとに上下のバーがズレていく(-100~100の間で設定可能)
c1.overlap = 0
Python_棒グラフ_grouping属性
図11 grouping属性によるグラフの形態の選択

また、“積み上げ”タイプの棒グラフについては、overlap属性の設定が有効となり、隣接する辺の共有度合いを調整することができます。「100」で完全に隣接し、小さくするほど離れていきます。「-100~100」の範囲で指定します。<List7>の8行目

Python_棒グラフ_overlap属性
図12 overlap属性による隣接辺の調整

以上までが、平面棒グラフを描画する一連の解説となります。

5. 棒グラフ(立体:BarChart3D) のサンプルコード

<2.>冒頭でも触れましたが、棒グラフには、立体(3D)表現することができるBarChart3Dクラスが用意されています。

3D棒ブラフは、<List8>のように「BarChart3Dクラス」からChartオブジェクトを取得し平面グラフと同じように参照先情報や属性を設定していきます。

# 3D棒グラフ本体を定義するクラス
from openpyxl.chart import BarChart3D, Reference, Series

# Chartオブジェクト(3D棒グラフの実体)を取得
c1 = BarChart3D()

基本的な属性は平面(2次)のものと共通ですが、立体(3次)では次数が増えますので、設定可能な属性もその分増えることになります。ただ、特にこだわりがないのであればどの属性に関してもデフォルト設定(特に設定する必要はない)のままで構わないと思われます。

いくつか、特徴的な属性を表1に紹介します。

Chartオブジェクトの属性機能詳細
backWallプロパティ背面の設定(調査中)
floorプロパティ床面の設定(調査中)
sideWallプロパティ側面の設定(調査中)
view3Dプロパティ立体の視点を調整(調査中)
gapDepthプロパティ床面の奥行を調整0~500の範囲で設定する
shapeプロパティバーの形状を指定{‘pyramid’, ‘pyramidToMax’, ‘coneToMax’, ‘cylinder’, ‘box’, ‘cone’}

次の<List9>は、<表1>の中から、バーの形状を指定できるshape属性と床面の奥行を調整するgapDepth属性を設定したコードの抜粋です。

# バーの形状をshape属性で指定
# {‘pyramid','pyramidToMax','coneToMax','cylinder',box',cone’}
c1.shape = "cylinder" # 円柱

# 床面の奥行を指定する(0~500)
c1.gapDepth = 250

<List8><List9>を反映させたグラフは以下のようになりました。

shape属性に「円柱」を意味する“cylinder”を指定しているのでバーが円柱表記になっています。また、gapDepth属性によって奥行が調整できることも確認いただけます。

Python_3D棒グラフのサンプルコード実行例
図13 立体(3D)棒グラフの実行例

以上が、立体(3D)棒グラフの作成方法を平面グラフとの差分でした。繰り返しますが、基本的なコードは同じなため、共通するコードの解説は割愛します。

6. まとめ

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

Excelを操作する外部ライブラリ「openpyxl」を使用して、棒グラフの作成手順を実例を交えて紹介しました。

前回<連載7回目>のクラスやオブジェクトの説明だけでは分かりずらい点もあったかもしれませんが、実際のコードを読むことでより簡単なコードで直感的に理解できるかと思います。

ここまでの内容をまとめておきましょう。

➀. 棒グラフのような系列ごとに同じ項目(カテゴリ)を共有するグラフのChartオブジェクトを生成する際の注意点は以下の2つがあります。

「Referenceオブジェクト」にてデータの参照情報を複数の系列まとめて一括取得する。

Seriesオブジェクトを使って系列ごとに追加していくようなことはできない。(後から系列を追加するようなこともできない。)

➁. 系列ごとのバーに装飾(塗りつぶし、パターン)を施す際は、系列情報となるSeriesオブジェクトを取得したのち配下の属性で設定していく。

グラフにはこのほかにもさまざまなタイプのものがあります。

たとえば、今回の棒グラフのように、項目(カテゴリ)を系列で共有するようなタイプの「折れ線グラフ」といったものがあります。

また次の機会にその他タイプの紹介もしていけたらと思いますので、どうぞお楽しみになさって下さい。

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

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