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")
こんなふうになりました。
この矢印のところの枠線を消したり、この枠線の内側を塗りつぶすのが目標です。
枠の中を塗りつぶしてみる
すこし調べるとplot_area
のgraphicalProperties
というのを設定するといいみたいです。
わかりやすいように、赤く塗ってみます。
from openpyxl.chart.shapes import GraphicalProperties
...
chart.plot_area.graphicalProperties = GraphicalProperties(solidFill="cc0000")
うーん、思っていた範囲と違います。
legend
というのもありますが、これは、違う気がします。
ま、一応やってみましょう。
緑にしてみます。
chart.legend.graphicalProperties = GraphicalProperties(solidFill="00cc00")
ま、そうですよね。
legendってそこですよね。
もう少し調べてみると、
chart.graphical_properties
というのがあるようです。
Camel Caseじゃなくて、Snake Caseです。
試してみましょう。
chart.graphical_properties = GraphicalProperties(solidFill="0000cc")
うーーん。だめです。変化なしです。
検索してみると、動かないとか、古いバージョンでは動いたとかいくつか嫌な情報があります。
調査
ということで、ソースを見てみます。
PieChart
は_PieChartBase
を継承して、_PieChartBase
はChartBase
を継承して、このChartBase
にgraphical_properties
が定義されています。
class ChartBase(Serialisable):
....
graphical_properties = Typed(expected_type=GraphicalProperties, allow_none=True)
しかし、よくソースを追いかけてみると、graphical_propertiesは__init__
でNoneに初期化されているだけでどこからも参照されていません。
これは一体どうしたことでしょうか。
_write
関数にあるChartSpace
のspPr
がGraphicalProperties
を持つようなので、無理矢理入れてみます。
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()
できました!!!
なんなんでしょうね。バグなんでしょうか。
ついに枠を消す
ここまでできたら、本題の枠を消すのをやってみましょう。
こんなコードになりました。
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")
できました!!
さいごに
ライブラリを直接いじったのですが、なんかほかにうまくできないでしょうかね。
また、時間あるとき挑戦してみましょう。