openpyxlはExcelの読み書きだけでなく、グラフを作成することが可能です。さらにopnepyxlではグラフの細かい設定を行うことも可能です。
そこで今回は、openpyxlで線の色、太さ、種類、マーカーの設定をする方法を解説します。
openpyxlで綺麗なグラフを作り、pythonだけでExcel作業を完全自動化しましょう。
環境
今回使用したPythonとopenpyxlのバージョンは以下の通りです。Anacondaを使用しました。
- Python = 3.6.10
- openpyxl = 3.0.3
Excelへ書き込みとグラフの作成
まずはopenpyxlを使ったExcelへ書き込み、グラフを作成します。グラフ作成の詳細はこちら。
import os
import numpy as np
import openpyxl
from openpyxl import Workbook
from openpyxl.chart import ScatterChart, Reference, Series
dirname = os.path.expanduser("~")
filename = "openpyxl_chart.xlsx"
xlfile = os.path.join(dirname, "Desktop", filename)
#workbook and worksheet
wb = Workbook()
ws = wb.create_sheet("sheet01", 0)
#データ作成
X = np.arange(0, 100, 20)
Y1 = X ** 2
len_data = len(X)
num_series = 1
#Excelへ書き込み
ws.cell(row = 1, column = 1, value = "X")
ws.cell(row = 1, column = 2, value = "Y1")
for i in range(0, len_data):
ws.cell(row= i + 2, column = 1, value = X[i])
ws.cell(row= i + 2, column = 2, value = Y1[i])
#ScatterChartオブジェクト作成
chart = ScatterChart()
#xの範囲を設定
min_row = 2
max_row = min_row + len_data - 1
x_values = Reference(ws, min_col = 1, min_row = min_row, max_row = max_row)
#yの範囲を設定
min_col = 2
values = Reference(ws, min_col = min_col, min_row = min_row, max_row = max_row)
#グラフの追加
series = Series(values, x_values, title="ScatterChart")
chart.series.append(series)
ws.add_chart(chart, "D6")
#保存
wb.save(xlfile)

グラフの線のスタイルを変更する
グラフの線や太さを変更するためには、 SeriesオブジェクトのspPrプロパティをつかい、以下のような書式を用います 。
series.spPr.ln.プロパティ名 = 値
spPrプロパティにはGraphicalPropertiesオブジェクトがセットされています。
GraphicalProperitesオブジェクトはlnプロパティを持っており、lnプロパティにはLinePropertiesオブジェクトがセットされています。
LinePropertiesオブジェクトの各プロパティに値をセットすることでグラフの線のスタイルを変更することが出来ます。
線の色を設定
線の色を変更するにはLinePropertiesオブジェクトのsolidFillプロパティを使用します。
solidFillに 16進数のカラーコードの”#”( ハッシュマーク)を除いた文字列をセットすると色を変更することが出来ます。
RGBを16進数に変換するときは、こちらを参考にするとよいでしょう。
#線の色を変更
series.spPr.ln.solidFill = "000000" #RGBHEXの先頭の"#"を除いた値
また、LinePropertiesのSolidFillの説明を見ると以下のように書かれています
Values must be of type <class ‘openpyxl.drawing.colors.ColorChoice’>
ColorChoiceを調べると、solidFillにColorChoiceオブジェクトセットすることで16進数以外の表記で色の指定ができることがわかります。
例えば、日常的に使うRed, Greenといった文字で色を指定したい場合は、以下のようにします。
from opnepyxl.drawing.colors import ColorChoice
series.spPr.ln.solidFill = ColorChoice(prstClr="dkOrange")
##以下のように書いてもよい
ch = ColorChoice()
ch.prstClr = "dkOrange"
series.spPr.ln.solidFill = ch
線の太さを設定
線の太さを変更するには、LinePropertiesオブジェクトのwまたはwidthプロパティを使用します。
LinePropertiesを見ればわかりますが、widthはwのエイリアスです。
opnepyxlでは線の太さにはemuという単位が使用されています。1 point = 12700 emuです。
#線の太さを変更
series.spPr.ln.w = 1 * 12700 # 1point = 12700 emu
線の種類を設定
線の種類を変更するには、LineProperitesオブジェクトのprstDashプロパティを使います。
prstDashに設定できる値は ‘sysDashDotDot’, ‘solid’, ‘dash’, ‘sysDot’, ‘sysDash’, ‘lgDashDotDot’, ‘sysDashDot’, ‘dot’, ‘lgDash’, ‘lgDashDot’, ‘dashDot’ です。
series.spPr.ln.prstDash = "dot"
まとめて設定
線の太さ、色、種類は以下のような書式でも変更できます。
from openpyxl.drawing.line import LineProperties
from openpyxl.chart.shapes import GraphicalProperties
series.spPr = GraphicalProperties(ln =LineProperties(solidFill="000000", w=1*12700, prstDash="dot))
グラフの線を滑らかにする
曲線を滑らかにするには、Seriesオブジェクトのsmoothプロパティを使用します
smoothプロパティは真偽値(Boolean)のみを受け取るので、使い方は簡単です。
series.smooth = True
マーカーを設定する
マーカーの設定にはSeriesオブジェクトのmarkerプロパティを使います。
markerプロパティには Markerオブジェクト がセットされています。
Markerオブジェクトのプロパティに値をセットすることで、マーカーの設定が出来ます。
series.marker.プロパティ名 = 値
マーカーのシンボルとサイズの設定
マーカーのシンボル設定には、Makerオブジェクトのsymbolプロパティを使用します。
symbolプロパティに設定可能な値は ‘triangle’, ‘diamond’, ‘plus’, ‘square’, ‘dash’, ‘star’, ‘picture’, ‘x’, ‘dot’, ‘circle’, ‘auto’ です。
series.marker.symbol = "circle"
マーカーのサイズ変更は、Markerオブジェクトのsizeプロパティを使います。 値の設定はExcelと同じようにします。
series.marker.size = 10
マーカーの色を設定
マーカーの色や線の太さの設定には、MakerオブジェクトのspPrプロパティを使用します。
先ほど説明したように、spPrには GraphicalPropertiesオブジェクトがセットされていますので、GraphicalPropertiesのプロパティを使用します。
GraphalPropertiesのプロパティはの使い方は、グラフの線のスタイル変更で説明した方法と変わりません。
series.marker.spPr.プロパティ名 = 値
マーカーの塗りつぶしは、GraphicalProperitesのSolidFillプロパティを使用します。
series.marker.spPr.solidFill = "ff0000" #RGBHEXの先頭の"#"を除いた値
線の色を変えるときと同様にsolidFillにColorChoiceオブジェクトをセットしても構いません。
マーカーの塗りつぶしをしたくない場合は、noFillプロパティを使用します。
series.marker.spPr.noFill = True
マーカーの線のスタイルを設定
マーカーの線のスタイルを変更するためには、GraphicalProperitesオブジェクトのlnプロパティを使用します。
series.marker.spPr.ln.プロパティ = 値
マーカーの色を変更するには、LinePropertiesのSolidFillプロパティを使い、マーカーの太さを変更する為にはLinePropertiesのwプロパティを使用します
#線の色を変更
series.marker.spPr.ln.solidFill = "000000" #RGBHEXの先頭の"#"を除いた値
#線の太さを変更
series.marker.spPr.ln.w = 1 * 12700 # 1point = 12700 emu
もちろん、solidFillにColorChoiceオブジェクトをセットし、16進数以外の記法で色を設定しても構いません。
まとめて設定
マーカーの設定も以下のように書くことが出来ます。
from openpyxl.chart.marker import Marker
from openpyxl.drawing.line import LineProperties
from openpyxl.chart.shapes import GraphicalProperties
series.marker = Marker(symbol="circle", size=5, spPr=GraphicalProperties(solidFill="ff0000", ln = LineProperties(solidFill="000000", w = 1 * 12700)))
具体例
#(省略)
series = Series(values, x_values, title="ScatterChart")
series.spPr.ln.solidFill = "b6bff"
series.spPr.ln.w = 3 * 12700
series.spPr.ln.prstDash = "dash"
series.smooth = True
chart.series.append(series)
#(省略)

from openpyxl.drawing.line import LineProperties
from openpyxl.chart.shapes import GraphicalProperties
#(省略)
series.spPr = GraphicalProperties(ln = LineProperties(solidFill="b6bff", w = 3 * 12700, prstDash = "dash))
series.smooth = True
series.marker.symbol = "circle"
series.marker.size = 15
series.marker.spPr.noFill = True
series.marker.spPr.ln.solidFill = "000000"
#省略

困ったときの対処法
openpyxlの細かい使い方は、ネットで調べてもあまりヒットしません。
使い方で困ったときは、マニュアルをじっくり読み込む必要があります。しかし、マニュアルがあまり親切でないので、これが結構疲れます。
そこで簡単にどのようにマニュアルを辿ればよいか説明します。
例えば、グラフの線に関する変更は、SeriesオブジェクトのspPrプロパティを使えばいいとわかったとします。
ところが、SeriesオブジェクトのspPrの説明を見ても以下の説明だけが書かれており、使い方の詳細は分かりません。
Values must be of type <class ‘openpyxl.chart.shapes.GraphicalProperties’>
とりあえず、spPrはGraphicalPropertiesオブジェクトをとると言うことはわかるので、 検索窓に”openpyxl.chart.shapes.GraphicalProperties” と入れてGraphicalPropertiesクラスを調べます。
GraphicalPropertiesの説明を見ると、プロパティが列挙されており、各プロパティはどのようなオブジェクトをとるか書かれています。
例えばGraphicalPropertiesのlnプロパティは LinePropertiesオブジェクトをとると書かれているので、LinePropertiesクラスを調べます。
LinePropertiesのプロティを見ると、w(width)やsolidFillなど、線に関係しそうなプロパティが現れ、ようやく、どのような値をセットすべきなのを知ることが出来ます。
そして、各プロパティをメソッドチェーンで連結します。
series.marker.spPr.ln.プロパティ = 値
つまり、プロパティにセットされるオブジェクトを調べ、ひたすら各オブジェクト(クラス)のマニュアルをたどって行くことが必要になります。
各クラスのマニュアルからソースコードを直接見ることが出来きます。
直接 GraphicalPropertiesクラスやLinePropertiesクラスにアクセスしたい場合は、ソースコードも確認しておくと良いでしょう。
設定可能な引数やコメントアウトにヒントが隠されていることもあります。
openpyxlで色々設定しようとすると最初は非常に苦労します。試行錯誤してみて下さい。