Pythonライブラリ(openpyxl)によるExcel「散布図・バブルチャート」の作り方とデザインレシピ【徹底解説】

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

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

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

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

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

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

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

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


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

➀. 散布図・バブルチャートといった系列ごとに異なるカテゴリ(X軸の値)を指定できるグラフタイプの作成方法が分る。

➁. 詳細なコード解説により、「グラフ全体の構成要素の追加・設定」や「Chartクラスや配下の属性」「系列データ(Seriesオブジェクト)の書式設定」といったことが分る。

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

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

スポンサーリンク

1. グラフ作成の手順

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

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

グラフ作成の手順を体系化したのが図2になります。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

➂で追加したSeriesオブジェクトに塗りつぶし、枠線などの装飾効果を適用させます。

➂でオブジェクト定義と同じタイミングで設定しても構いません。

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

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

以上が、散布図、バブルチャートといったタイプのグラフ作成手順となります。次節より具体的なコード例を交えながら詳細に解説していきます。

2. 散布図/バブルチャートについて

Python_基本文法_内包表記

散布図とバブルチャートは、X軸(項目名)とY軸(値)の対となるデータの分布(ばらつき)または推移を表現するのに都合のよりグラフになります。

同じようなグラフタイプに「折れ線グラフ(LineChart)」がありますが、各系列ごとにXの値(カテゴリ)が固定されない点に違いがあります。

このタイプは、系列ごとに参照領域情報をSeriesオブジェクトとして定義する必要があります。

散布図を提供するクラスは、ScatterChart()が用意されています。

ScaterChart

散布図

from openpyxl.chart import ScatterChart

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


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

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

戻り値:Chartオブジェクト

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

散布図の形態には、Excelであれば、マーカーだけプロットしたもの、ラインを描画したものあるいは、その両方など5種類の中から選ぶことができます。(図4 左)

上記クラスの仕様上では「引数scatterStyle」にオプション指定することでそれらを設定できるとありますが、以下「公式ドキュメント」の注意書きによると、このオプション指定しても(今のところ)機能しないようです。

よって、マーカーや線の設定などは系列ごとSeriesオブジェクトから個々に手動で設定するしかないとのことです。

The specification says that there are the following types of scatter charts: ‘line’, ‘lineMarker’, ‘marker’, ‘smooth’, ‘smoothMarker’.

However, at least in Microsoft Excel, this is just a shortcut for other settings that otherwise have no effect. For consistency with line charts, the style for each series should be set manually.

openpyxl公式ドキュメント<散布図の獣類(scatterStyle)についてのコメント>

次にバブルチャートについてです。

openpyxlではバブルチャートの機能を提供する、BubbleChartクラスが用意されています。

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

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

バブルチャートは、先の散布図へ3次元要素を追加し(Z方向)、3次データの大きさに応じたたプロット (バブル状)を描画できる立体(3D)グラフになります。

そのため、クラスには立体表現に関係する引数が多数用意されていますので、ここではその内の3つを紹介します。

引数bubbleScaleは、バブルの大きさを指定します。通常、バブルチャートではSeriesクラスの第3引数zvaluesにバブル径の大きさを指定しますが、この引数bubbleScaleによって大きさの相対的な比率はそのままに径の拡大・縮小を0%~300%の間で指定でけます。

また、引数sizeRepresentsによってバブル径のサイズへの反映方法を‘area’(面積)、’w’(幅)から選択することができます。省略した場合は面積で表現されます。

また、1点注意点もあります。

BubbleChartクラスを代表する引数に「引数bubble3D」がありますが、仕様書にはBool型(“True”/”False”)で3次元表記できる旨の表記がありますが、実際に設定するとエラーが表示され反映させることはできませんでした。(すくなくともExcel環境ではエラーが発生します。デフォルト設定である“None”では発生しません。)

Python_散布図_バブルチャートの種類rev0.2
図4 散布図とバブルチャートの種類

ここまでが、散布図とバブルチャートの概要説明になります。次項より具体的なサンプルコードを示しながらグラフの作成手順を解説していきます。

3. 散布図(ScatterChart)のコード例

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

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

系列が6つに、項目が6つのプロットをもつ「散布図」とする

散布図の形態は「マーカー」とし、シンボルや色を系列ごとに指定する

一部カテゴリのプロットにデータラベルを表示する

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

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

3.1 ScatterChartクラスのインポートなど

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

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

from openpyxl import load_workbook

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

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

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


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


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

# Chartオブジェクト(散布図の本体)を取得
c1 = ScatterChart()

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

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

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

#---------------------------------------------
# <List2>へ続く
6,9,12行目

ScatterChartクラスと各系列データの個別設定に必要なクラス群をインポートしています。

23行目

散布図の本体となるChartオブジェクトをScatterChartクラスからコンストラクタします。これ以降はこのChartオブジェクト配下のメソッドや属性(プロパティ)を使ってグラフのサイズの指定、メイン・サブタイトルの設定と続き、凡例の配置位置を各種属性で指定しています。

グラフのタイプに関わらず共通ですので、詳細は<折れ線棒グラフ>を参照下さい。

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

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

3.2 散布図の参照情報と系列の定義

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

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

# [B] Chartオブジェクトに系列データを設定する ------------------------------------------------

# 系列ごとに参照情報を取得する
for i in range(3, 9):
    
    # 系列のY軸の値の参照する(系列名となる行も含めて参照する)
    # "i"列, 4行目-10行目
    values = Reference(ws, min_col=i, max_col=i, min_row=4, max_row=10)
    
    # 系列のX軸の値の参照する
    # "i"+8列, 5行目-10行目 
    xvalues = Reference(ws, min_col=i+8, max_col=i+8, min_row=5, max_row=10) 
    
    # 系列のデータをSeriesオブジェクトとして定義する
    series = Series(values, xvalues, title_from_data=True)
    
    # Seriesコレクションに個々のSeriesオブジェクトを追加する
    c1.series.append(series)

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

4行目 系列ごとにSeriesオブジェクトを定義する必要があるので、For文によって繰り返し処理をします。

8, 12行目 X,Y軸の参照情報の取得

8行目は、系列のY軸の値の参照情報となるReferenceオブジェクトを定義します。今回は、系列名となる行番号も含めて参照するようにします。

12行目は、系列のX軸の値の参照情報となるReferenceオブジェクトを定義します。注意が必要なのは、ここでは系列名となる行番号は含めないことです。

15行目 系列Seriesオブジェクトの定義

上記X,Yの参照情報をめとめて系列情報Seriesオブジェクトを定義します。

「引数title_from_data」に“True“とすることで系列名を”C4:H4“(範囲の先頭行(※)の要素)から引用します。

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

Python_散布図のセル範囲の参照情報_List2_rev0.1
図6 Seriesオブジェクトの定義
18行目 Chartオブジェクトへ系列を追加

series属性」でSeriesコレクションを取得し、「append()メソッド」で個々のオブジェクトを追加します。

ここまでのコードを実行した結果は図7のようになります。デフォルトではプロット同士がラインで結ばれた形態になっています。散布図はばらつきの分布を把握することが多いですから、ラインよりもマーカーで表現した方良い場合があります。今回の場合もラインは不要でしょう。

Python_散布図_List1-List2の実行結果
図7 <List2>の実行結果

3.3 散布図の系列の書式設定

<List2>に続き<List3>を追加します。<List3>では、系列の形態と装飾など見栄えを整えていきます。

# [C] 系列ごとにマーカーを設定する -----------------------------

# 各系列のプロットを表現するマーカーのシンボルの指定を辞書形式で用意
marker_symbol = {1:"triangle", 2:"diamond", 3:"square", 4:"star", 5:"circle", 6:"plus"}

# マーカーを塗り潰す色を同様に辞書形式で用意
# 色の指定はRGBのHex指定とColorChoiceオブジェクト指定による2タイプで指定
marker_solidFill = {1:"FF00FF", 2:"FFFF00", 3:"FFF0F",
                        4:ColorChoice(prstClr="midnightBlue"),
                        5:ColorChoice(prstClr="yellowGreen"),
                        6:ColorChoice(prstClr="cornflowerBlue")}


# データラベルを定義する(全系列の項目2番目にのみラベルを適用する)
lb = DataLabel(idx=1, showVal=True)
lbl = DataLabelList(dLbl=[lb])


# 個々のSeriesオブジェクトへ属性を設定します
# enumerateでオブジェクトとインデックスを同時に展開します
for i, obj in enumerate(c1.series, 1):
    
    # ラインを無効
    obj.graphicalProperties.line.noFill = True
    # 以下マーカーの設定
    obj.marker.symbol = marker_symbol[i] # シンボルを指定
    obj.marker.size = 10                 # サイズを指定
    obj.marker.graphicalProperties.solidFill = marker_solidFill[i]  # 塗りつぶし色
    obj.marker.graphicalProperties.line.solidFill = "000000"        # 枠線を黒に設定
    # データラベルを設定
    obj.labels=lbl


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

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

先の図7のように、今回のデータ分布であればラインよりも各プロットをマーカーで表記した方が都合がよさそうです。そこで、今回は各系列のSeriesオブジェクトから配下の属性を使ってマーカーの設定をしていきます。

4,8行目 【マーカー書式の定義】

・マーカのシンボルと塗りつぶし色をあらかじめ辞書で定義します。シンボルに指定できる既定のオプションは、{‘plus’, ‘diamond’, ‘square’, ‘dash’, ‘circle’, ‘x’, ‘auto’, ‘circle’, ‘star’, ‘picture’, ‘triangle’}から選択することができます。

・また、色は、「RGBのHex表記(文字列)」で指定する方法と「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オブジェクト

15,16行目 【データラベルの定義】

・系列の2番目の項目(カテゴリ)にのみデータラベルを適用するようにDatalabelオブジェクトを定義します。Datalabelクラスの書式は以下の通りです。

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

21行目では、For文enumerateメソッドによって、コレクションからSeriesオブジェクトとインデックスを取得して、各属性によって設定を行います。

24行目 【ラインの設定】

デフォルトのラインスタイル (図7)から、マーカースタイルに変更するため、Lineオブジェクトnofill属性に“True”を設定してラインを無効にしています。

Lineオブジェクトについては<こちら>を参照下さい。

26~29行目 【マーカーの設定】

Markerオブジェクトの各属性でマーカーに書式を適用します。シンボルと色は4,8行目で定義した辞書からインデックスをキーとしてそれぞれの系列に設定します。サイズ(10)と枠線(黒)は固定値としています。

Markerオブジェクトについては<こちら>を参照下さい。

最後に、labels属性でDatalabelオブジェクトを設定し、シートにChart貼り付けてブックを保存します。


サンプルコードの解説は以上となります。<List1>~<List3>をすべて連結、実行した結果は図8のようになりました。

プロットがマーカー表記となり、シンボルの形状や色、それから2番目の項目に対してデータラベルが付加されました。

Python_散布図_List1-List3の実行結果
図8 サンプルコードの実行結果<List1>~<List3>

4. バブルチャート(BubbleChart) のコード例

引き続き、次のような仕様をもつバブルチャートのサンプルコードを幾つかのListに分けて順番に解説していきます。

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

系列が3つに、項目を4つの、プロットをもつ「バブルチャート」とする

2Dと3Dのバブルを混載する

バブルにグラデーションの装飾を施す

4.1 BubbleChartクラスのインポートなど

はじめに<List1>では必要なクラスのインポートから、グラフ本体となるBubbleChartオブジェクト、それから凡例やスタイルといった基本構成の設定をしています。

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

from openpyxl import Workbook

# バブルチャート(グラフ本体、データ参照情報の定義)に必要となるクラス
from openpyxl.chart import BubbleChart, Series, Reference

# グラデーション塗り潰しに必要なクラス➀
from openpyxl.drawing.fill import GradientFillProperties, GradientStop

# グラデーション塗り潰しに必要なクラス➁
from openpyxl.drawing.fill import ColorChoice, LinearShadeProperties

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


# [A] グラフ本体とグラフ概要の設定 ---------------------------------------------------------

# Chartオブジェクト(散布図の本体)を取得
c1 = BubbleChart()

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

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

# スタイル設定
c1.style = 18

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

6行目で、BubleChartクラスと9,12行目で各系列の個別設定に必要となるクラス群をインポートしています。

22行目以降 グラフの構成要素の設定

22行目でバブルチャートの本体となるChartオブジェクトをBubbleChartクラスからコンストラクタします。これ以降はこのChartオブジェクト配下のメソッドや属性(プロパティ)を使ってグラフの詳細設定をしていきます。

グラフのタイプに関わらず共通ですので、詳細は<折れ線棒グラフ>を参照下さい。

ちなみに、32行目のstyle属性では、既定のグラフスタイル(色調や影・立体効果など)を簡単に設定することができます。このあと紹介します。

4.2 バブルチャートの参照情報と系列の定義

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

# [B] Chartオブジェクトに系列データを設定する -----------------------------------------------

# 系列ごとに参照情報を取得する
for i in range(2, 5):
    
    # "i"列, 5行目-8行目
    xvalues = Reference(ws, min_col=i, max_col=i, min_row=5, max_row=8)      # X軸のデータ
    # "i+4"列, 4行目-8行目
    yvalues = Reference(ws, min_col=i+4, max_col=i+4, min_row=4, max_row=8)  # Y軸のデータ
    # "i+8"列, 4行目-8行目
    zvalues = Reference(ws, min_col=i+8, max_col=i+8, min_row=5, max_row=8)  # バブルの大きさ
    
    # 個々の系列データをSeriesオブジェクト(3次元)として定義する
    series = Series(values=yvalues, xvalues=xvalues, zvalues=zvalues, title_from_data=True)    
    
    # Seriesコレクションに系列データを追加していく
    c1.series.append(series)

#---------------------------------------------
# <List3>へ続く
4行目

系列ごとにSeriesオブジェクトを定義する必要があるので、For文によって繰り返し処理をしています。

7~14行目 参照情報と系列の定義

<散布図>を含め他のグラフと異なる点は、11行目で定義している参照領域情報の定義が3次元分(バブルの大きさの指定)が必要になる点です。14行目のSeriesクラスの「引数zavlues」に参照情報を設定します。(図9)

Python_バブルチャートのセル範囲の参照情報_List2_rev0.1
図9 参照範囲情報と系列の定義

そして、「series属性」でSeriesコレクションを取得し、「append()メソッド」で個々のオブジェクトを追加します。<散布図と同様>

ここまでのコードを実行した結果を示しておきます。先のstyle属性の指定だけでも綺麗なバブルソートが描画できています。

Python_バブルチャート_List1-List2の実行結果
図10 サンプルコード<List1><List2>の実行結果

ちなみに、style属性で設定可能なスタイル一覧を紹介します。

バブルの「色合い」は次の(図11)に示す8種類規定値が選べます。

Python_バブルチャート_スタイル色合い一覧_rev0.1
図11 style属性(バブルの色合)一覧

また、バブルへの「効果」は次の(図12)のように6種類の規定値があります。

Python_バブルチャート_スタイル効果一覧_rev0.1
図12 style属性(バブルの効果)一覧

もちろん、style属性で設定する以外にも、ユーザー独自のスタイル書式を定義することも可能です。次の<4.3項>で系列ごとの書式設定の例を紹介します。

4.3 バブルチャートの系列の書式設定

<List2>に続き次の<List3>を追加します。<List3>では、系列ごとに詳細設定を施す処理を記述していきます。

# [C] 系列ごとに設定する ------------------------------------------------

# 系列2に対する設定
ser2 = c1.series[1]
ser2.bubble3D = True # 3D表記にする


# 系列3に対する設定
ser3 = c1.series[2]
ser3.bubble3D = True # 3D表記にする

# グラデーション効果を適用する

# 色の階調をGradientStopオブジェクトとして定義する(色の指定としきい値)
gs1 = GradientStop(pos=20000, prstClr="medVioletRed")
gs2 = GradientStop(pos=60000, prstClr="aquamarine")
gs3 = GradientStop(pos=90000, prstClr="cornflowerBlue")

# グラデーション効果をGradientFillPropertiesオブジェクトとして定義する
gfProp = GradientFillProperties()           # オブジェクトを取得
gfProp.stop_list = [gs1, gs2, gs3]          # stop_list属性で色階調の定義情報を渡す
gfProp.linear = LinearShadeProperties(90)   # グラデーションを線形変化

# 以下のようにクラスの引数に直接渡たすこともできる
#gfProperty = GradientFillProperties(gsLst=[gs1, gs2, gs3], lin=LinearShadeProperties(90))

# gradFill属性で、GradientFillPropertiesオブジェクトを設定する(グラデーションの適用)
series.graphicalProperties.gradFill = gfProp


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

ws.add_chart(c1, "D12")
wb.save("Bubble_Sample.xlsx")
4,5,9,10行目 系列2,3の設定(立体[3D])

Seriesコレクションから、インデックス“1”,”2”を指定して、系列2,3のオブジェクトを取得しています。冒頭の<BubbleChartクラス>の仕様の解説で引数bubble3Dでは、立体(3D)表現できないと解説しましたが、実は、Seriesオブジェクトにも「引数bubble3D」があり、こちらに“True”を指定することにより立体表現が実現できます。

つまり、このことは1つのプロットエリア内で系列ごとに立体・平面を指定でき共存させることができるということです

5~17, 20~22行目 グラデーションの定義

今回は、系列3に3色の線形グラデーション効果を適用させることにします。

まずグラデーションの階調情報(色、しきい値)となるGradientStopオブジェクトを15~17行目のように定義します。

次に、グラデーション定義の本体となるGradientFillPropertiesオブジェクトを取得し、stop_list属性で階調情報を、linear属性で変化の仕方を設定します。また、25行目のコメントにあるように、クラスの引数に直接指定する方法でも同じことができます。

GradientStopオブジェクト

from openpyxl.drawing.fill import GradientStop

GradientStop(pos, scrgbClr, schemeClr, prstClr)


引数:pos: 色の切替類値を指定する

引数:scrgbClr: RGBで色指定する               Hex文字列6桁で指定する

引数:schemeClr: テーマカラーで色指定する   SchemeColorオブジェクトで指定する

引数:prstClr: 既定の色で指定する

({‘cornflowerBlue’, ‘darkCyan’, ‘darkSlateGrey’, …など多数のオプションの中から選択)

戻り値:Chartオブジェクト

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


from openpyxl.drawing.fill import GradientFillProperties

GradientFillProperties(gsLst, lin, path, tileRect)


引数:gsLst: グラデーションの階調色の指定としきい値(位置)を設定

(GradientStopオブジェクトをリスト形式で設定する)

引数:lin: グラデーションの変化方法に”線形”にする

(LinearShadePropertiesオブジェクトを設定する)

引数:path: グラデーションの変化方法に”パス”にする

(PathShadePropertiesオブジェクトで設定する)

引数:tileRect: グラデーションの変化方法を”四角”にする

(RelativeRectオブジェクトで設定する)

戻り値:Chartオブジェクト

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

そして、最後に28行目のgradFill属性で定義したグラデーション情報を適用させます。


サンプルコードの解説は以上となります。<List1>~<List3>をすべて連結、実行した結果は図13のようになりました。系列2,3が立体表現となり、かつバブルにグラデーションが適用されています。

Python_バブルチャート_List1-List3の実行結果
図13 サンプルコード(<List1>~<List3>)実行結果

5. まとめ

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

Excelを操作する外部ライブラリ「openpyxl」を使用して、散布図・バブルチャートの作成手順を実例を交えて紹介しました。

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

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

➀. 散布図・バブルチャートといったような系列ごとに異なる項目(カテゴリ)を設定することができるタイプは、系列ごとにSeriesオブジェクトを定義して、Chartオブジェクトに追加していく。

➁. 散布図は、クラスの「引数scatterStyle」ではグラフの形態を設定することができずSeriesオブジェクトに分解して個別にマニュアルで設定する必要がある。

➂. バブルチャートで3D効果を適用する場合は、クラスの「引数bubble3D」を設定しても反映されないため、Seriesオブジェクトの同名の引数にて有効にする

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

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

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

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

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