2
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pandasのDataFrameを散布図グラフ付きExcelファイルで出力する

Posted at

社内用に、誰でもとりあえず機械学習がお試しできるアプリを作成することになった。
基本的に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')

キャプチャ.PNG

グラフの軸タイトルのフォント設定の仕方でしばらくハマってしまった。上記のコード記述も良くないと思う。。。動くけど。。。

2
12
0

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
  3. You can use dark theme
What you can do with signing up
2
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?