社内用に、誰でもとりあえず機械学習がお試しできるアプリを作成することになった。
基本的にMSOfficeで仕事する部署なので、学習・予測結果はExcelファイルで出力することとした。
その際、学習用データの実測値と予測値の散布図プロットも入れといてほしいとのこと。
Excelファイルを操作するライブラリをいくつかあたった結果、openpyxlならグラフも扱える模様。
openpyxlを使ってグラフを編集する方法のメモ↓
test.py
import pandas as pd
import openpyxl
data = {"measured val.": [866,931,926,1338,1490,1576,774,553,618,252],
"predicted val.":[936,923,526,1384,1165,1630,490,722,741,402]}
df = pd.DataFrame(data)
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "sheet1"
#シートにdataframeのデータを移す
xl_row = 2
xl_col = 1
for col in df.columns:
ws.cell(row=1, column=xl_col, value=col) #1行目にカラム名を入力
xl_row = 2 #行カウントを2に戻す
for row in df.index:
ws.cell(row=xl_row, column=xl_col, value=df.at[row, col]) #ws.cell()で指定したセルに値を入力できる
xl_row += 1 #1行進める
xl_col += 1
#グラフの追加
cht = openpyxl.chart.ScatterChart() #散布図
cht.x_axis.title = df.columns.values[0] #X軸タイトル
cht.y_axis.title = df.columns.values[1] #Y軸タイトル
cp = openpyxl.drawing.text.CharacterProperties(sz=1000) #フォントサイズの設定(ここでは10pt)
cht.x_axis.title.tx.rich.p[0].r.rPr = cp #X軸タイトルのフォントサイズ
cht.y_axis.title.tx.rich.p[0].r.rPr = cp #Y軸タイトルのフォントサイズ
xvalues = openpyxl.chart.Reference(ws, min_col=2, min_row=2, max_row=len(df)) #X軸(=実測Y)のデータ範囲指定
yvalues = openpyxl.chart.Reference(ws, min_col=1, min_row=2, max_row=len(df)) #Y軸(=予測Y)のデータ範囲指定
srs = openpyxl.chart.Series(yvalues, xvalues, title_from_data=False) #Chartに系列を追加する
srs.graphicalProperties.line.noFill = True #線を消す
srs.marker.graphicalProperties.solidFill = '0000FF' #マーカーの塗りつぶし
srs.marker.graphicalProperties.line.noFill = True #マーカーの枠線を消す
srs.marker.symbol = 'circle' #マーカーの形
srs.trendline = openpyxl.chart.trendline.Trendline(trendlineType='linear', dispRSqr=True) #近似曲線を設定
cht.series.append(srs) #Chartに系列を追加
cht.legend = None #凡例は無し
ws.add_chart(cht, 'C2') #C2セルにChartを追加
#保存
wb.save('test.xlsx')
グラフの軸タイトルのフォント設定の仕方でしばらくハマってしまった。上記のコード記述も良くないと思う。。。動くけど。。。