今回は、openpyxlでグラフエリア、プロットエリア設定変更について解説します。以前の記事と合わせれば綺麗なグラフを作ることが出来ます。
openpyxlでグラフの細かい設定が可能ですが、ちょっと面倒なことが多いです。
しかし、openpyxlを使えば、PythonでExcel作業の自動化し、仕事の効率を上げることが出来ます。
本記事を参考に色々試して使いなれて下さい。
この記事でもOpenpyxlの使い方は詳しく説明していますが、ここで説明していない情報が欲しい場合等は、以下の3冊が参考になります。
環境
今回使用したPythonとopenpyxlのバージョンは以下の通りです。Anacondaを使用しました。
- Python = 3.6.10
- openpyxl = 3.0.3
Excelへ書き込みとグラフの作成
Excelグラフは前回と同じグラフを使用します。
グラフエリアの設定
グラフエリアのサイズの設定
#グラフの大きさ
chart.height = 10
chart.width = 10
グラフタイトルの設定
#グラフのタイトル
chart.title = "Hoge"
系列の数が1つだけで、Series(values, x_values, title="hoge")
のように系列名を指定し、グラフタイトルを指定しない場合は、グラフタイトルは勝手に”hoge”となってしまいます。
枠線と色の設定
openpyxlで行うのは難しいと思います(恐らく出来ない?? )。
openpyxlのScatterChartのマニュアルを見てもやり方がわかりませんでした。
stackoverflowには、グラフエリアの色変更をしたいという質問がポストされています。
しかし、openpyxlで行うのは難しいという解答が記載されています。
” This is difficult because the underlying XML is 7, 8, 9 layers deep 🙁 openpyxl tries to simplify this where possible and doesn’t expose everything but changes can be discussed on the mailing list ”
https://stackoverflow.com/questions/48305158/how-to-set-up-the-graphical-properties-of-chart-area-using-openpyxl
ScatterChartは openpyxl.chart._chart.ChartBaseを継承しています。ChartBaseのソースコードを調べると
self.graphical_properties = None
という記述があります。graphical_propertiesにGraphicalPropertiesオブジェクトを設定すればよさそうですが、以下のようにしても何も変化しませんでした。
chart.graphical_properties = GraphicalProperties(noFill=True, ln=LineProperties(solidFill="FF0000"))
何か新しい情報あればアップデートしたいと思います。
プロットエリアの設定
プロットエリアのサイズと位置の設定
プロットエリアのサイズと位置の設定は、Chartオブジェクトのlayoutプロパティを使います。layoutプロパティにはLayoutオブジェクトをセットされており、以下のように使用します。
chart.layout = Layout(manualLayout = ManualLayout(x = 値, y = 値, w = 値、h = 値))
xは横の位置、yは縦の位置、wはプロットエリアの横の長さ、hはプロットエリアの縦の長さです。x, y, w, hには、チャートエリアのサイズを基準とした相対値(0〰1)を入れます。
from openpyxl.chart.layout import Layout, ManualLayout
chart.layout = Layout(ManualLayout(x = 0, y = 0, h = 0.8, w = 0.8))
グラフ位置の基準点は、デフォルトではチャートエリアの中心に設定されています。
その為、x = 0.1、y = 0.2とした場合は、チャートエリアの中心から右に0.1、左に0.2の場所にグラフが設置されます。
プロットエリアの基準点を変えたい場合は、xMode とyModeを使用します。
chart.layout = Layout(ManualLayout(x=値, y=値, w=値、h=値, xMode=値, yMode=値))
xModeとyModeの値を”edge”とすることで、基準点をチャートエリアの左端と上端に持ってくることが出来ます。
例えば、プロットエリアの左上隅をチャートエリアの基準点としたい場合は、以下のようにします。
from openpyxl.chart.layout import Layout, ManualLayout
chart.layout = Layout(ManualLayout(x = 0, y = 0, h = 0.8, w = 0.8, xMode="edge", yMode="edge"))
xModeとyModeのデフォルト値は”factor”です。xModeとyModeを設定しない場合はfactorとなり、 チャートエリアの中心点 がプロットエリアの基準点となります。
プロットエリアの色と枠線の設定
プロットエリアの色と枠線の設定、Chartオブジェクトのplot_areaプロパティを使用して行います。
プロットエリアの塗りつぶしは以下のようにします。
from openpyxl.chart.shapes import GraphicalProperties
chart.plot_area.spPr = GraphicalProperties(solidFill="FF0000")
ScatterChartクラスの継承元であるChartBaseクラスのソースコードを見ると、plot_areaプロパティにはPlotAreaオブジェクトがセットされていることがわかります。
PlotAreaクラスを調べると、spPrプロパティがあります。 前回説明した通り、色や線のスタイルの設定を行うには、このspPrプロパティにGraphicalPropertiesオブジェクトをセットすれば良いという訳です。
プロットエリアを塗りつぶしをしたくない場合は、noFillを使用します。
from openpyxl.chart.shapes import GraphicalProperties
chart.plot_area.spPr = GraphicalProperties(noFill = True)
プロットエリアの枠線を設定は以下のようにします。
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.line import LineProperties
chart.plot_area.spPr = GraphicalProperties(ln = LineProperties(solidFill = "FF0000"))
具体例
(省略)
chart.title = "HOGE"
chart.height = 10 #グラフエリアの高さ
chart.width = 15 #グラフエリアの幅
#プロットエリアの大きさと位置設定
chart.layout = Layout(ManualLayout(x = 0.1, y = 0.1, h = 0.75, w = 0.75, xMode="edge", yMode="edge"))
#プロットエリアの
chart.plot_area.spPr = GraphicalProperties(solidFill = "f2ffff", ln =LineProperties(solidFill="000000", w=2*12700))
(省略)