【Excel x Python】 openpyxlでExcelグラフのグラフエリア、プロットエリアの設定を行う【Pythonで自動化】

title_openpyxl

今回は、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の場所にグラフが設置されます。


プロットエリアの基準点を変えたい場合は、xModeyModeを使用します。

 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))
(省略)
グラフエリアとプロットエリアの設定
タイトルとURLをコピーしました