search
LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

Organization

openpyxlのchartでグラフの枠線を消す

openpyxlのchartでグラフの枠線を消す

openpyxlは便利なライブラリで、excelのグラフも自動で作ることができます。
たくさんのデータから、同じようなたくさんのグラフを作る場合など、excelでポチポチポチポチとクリックをしたくない時にとても便利です。
便利なのですが、グラフの枠線を消したり背景を変えることがうまくできなかったので、調べてみました。

まずグラフを作成

円グラフを表示してみます。

import openpyxl
from openpyxl.chart import PieChart, Reference


wb = openpyxl.Workbook()
ws = wb.active

ws["A1"] = "りんご"
ws["B1"] = 30
ws["A2"] = "みかん"
ws["B2"] = 60

chart = PieChart()
chart.add_data(Reference(ws, min_col=2, min_row=1, max_row=2))
chart.set_categories(Reference(ws, min_col=1, min_row=1, max_row=2))

ws.add_chart(chart, "B4")
wb.save("out.xlsx")

こんなふうになりました。

1.png

この矢印のところの枠線を消したり、この枠線の内側を塗りつぶすのが目標です。

枠の中を塗りつぶしてみる

すこし調べるとplot_areagraphicalPropertiesというのを設定するといいみたいです。
わかりやすいように、赤く塗ってみます。

from openpyxl.chart.shapes import GraphicalProperties
...

chart.plot_area.graphicalProperties = GraphicalProperties(solidFill="cc0000")

2.png

うーん、思っていた範囲と違います。

legendというのもありますが、これは、違う気がします。
ま、一応やってみましょう。
緑にしてみます。

chart.legend.graphicalProperties = GraphicalProperties(solidFill="00cc00")

3.png

ま、そうですよね。
legendってそこですよね。

もう少し調べてみると、
chart.graphical_propertiesというのがあるようです。
Camel Caseじゃなくて、Snake Caseです。

試してみましょう。

chart.graphical_properties = GraphicalProperties(solidFill="0000cc")

3.png

うーーん。だめです。変化なしです。

検索してみると、動かないとか、古いバージョンでは動いたとかいくつか嫌な情報があります。

調査

ということで、ソースを見てみます。

PieChart_PieChartBaseを継承して、_PieChartBaseChartBaseを継承して、このChartBasegraphical_propertiesが定義されています。

site-packages/openpyxl/chart/_chart.py
class ChartBase(Serialisable):
    ....
    graphical_properties = Typed(expected_type=GraphicalProperties, allow_none=True)

しかし、よくソースを追いかけてみると、graphical_propertiesは__init__でNoneに初期化されているだけでどこからも参照されていません。
これは一体どうしたことでしょうか。

_write関数にあるChartSpacespPrGraphicalPropertiesを持つようなので、無理矢理入れてみます。

site-packages/openpyxl/chart/_chart.py
class ChartBase(Serialisable):
    ....
    def _write(self):
        ....
        cs = ChartSpace(chart=container)
        cs.style = self.style
        cs.roundedCorners = self.roundedCorners
        cs.pivotSource = self.pivotSource
        cs.spPr = self.graphical_properties  <== この行を追加
        return cs.to_tree()

4.png

できました!!!

なんなんでしょうね。バグなんでしょうか。

ついに枠を消す

ここまでできたら、本題の枠を消すのをやってみましょう。
こんなコードになりました。

import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.shapes import GraphicalProperties, LineProperties


wb = openpyxl.Workbook()
ws = wb.active

ws["A1"] = "りんご"
ws["B1"] = 30
ws["A2"] = "みかん"
ws["B2"] = 60

chart = PieChart()
chart.add_data(Reference(ws, min_col=2, min_row=1, max_row=2))
chart.set_categories(Reference(ws, min_col=1, min_row=1, max_row=2))

chart.graphical_properties = GraphicalProperties(ln=LineProperties(noFill=True))

ws.add_chart(chart, "B4")
wb.save("out.xlsx")

5.png

できました!!

さいごに

ライブラリを直接いじったのですが、なんかほかにうまくできないでしょうかね。
また、時間あるとき挑戦してみましょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4