openpyxlで円グラフを作る方法は本に書いてあったり、ネットで検索しても情報がたくさん出てきますが、凡例の指定の仕方まで書かれているものはなかなか見つからなかったのでここに書いておきます。
##データ準備
以下のようなデータ表を用意します。
参考までに乱数を振って表にまとめるコードを載せておきます。(数字が書いてあればなんでもOKです)
import numpy as np
import pandas as pd
#make DataFtame
test_matrix = np.random.rand(3,3)
row_label = ['row_0','row_1','row_2']
col_label = ['col_0','col_1','col_2']
df = pd.DataFrame(test_matrix,index = row_label,columns=col_label)
df.to_excel('PieChart.xlsx', sheet_name='raw_data')
##円グラフ作成
以下、円グラフ作成のコードと実行結果です。
(グラフの大きさが違うのが気になる。揃えるオプションがあるのか、Libreの癖なのか。。。)
import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.label import DataLabelList
#read Excel file
wb = openpyxl.load_workbook('PieChart.xlsx')
ws = wb.copy_worksheet(wb['raw_data'])
for i in range (0,3):
#set PieChart
chart = PieChart()
chart.height = 5
chart.width = 10
data = Reference(ws,min_row=1, min_col=i+2,max_row=4)
labels = Reference(ws,min_row=2, min_col=1,max_row=4)
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
#set DataLabel
chart.dataLabels = DataLabelList()
chart.dataLabels.showVal = False
chart.dataLabels.showPercent = True
chart.dataLabels.dLblPos = 'outEnd'
#put graph
ws.add_chart(chart, ws.cell(row=10*i+6,column=1).coordinate)
#save Excel file
wb.save('PieChart.xlsx')
#set DataLabel
chart.dataLabels = DataLabelList()
chart.dataLabels.showVal = False
chart.dataLabels.showPercent = True
chart.dataLabels.dLblPos = 'outEnd'
グラフ一個だけなら手で設定しても問題ないが、今回の例のように複数グラフを同じ凡例の設定で並べて見たい時にはコード上で設定できた方がいい。
因みに今回の設定は「数値の表示」OFF,「割合の%表示」ON,[凡例の表示位置]外側、に設定している。
他の設定や詳細の引数などの情報は以下サイトに書かれています。