xlwings はPythonコード上からExcelを操作できるサードパーティライブラリです。
同じくPythonライブラリのmatplotlibはグラフを描画するのに便利なライブラリで、Jupyter notebook(Colaboratoryなど)でデータ分析をするときによく使われます。
描画されるグラフはただの画像ファイルなので自由にコピーもできますが、Pythonコードを実行して自動でExcelに表示したいケースもあると思います。
今回はExcelにmatplotlibで描画したグラフを表示させる方法を、株価チャートのデータを例にして解説しています。
結論
DataFrame hist
のグラフをExcelに描画したいとき
Sheet.pictures オブジェクトのadd()でFigureを登録。
import matplotlib.pyplot as plt
import xlwings as xw
plt.style.use('ggplot')
fig = plt.figure(figsize=(17,10))
plt.plot(hist['Close'], label='N225 Close', color='b')
plt.title('Stock Index')
sheet = xw.Book().sheets[0]
sheet.pictures.add(fig, name='StockPrice')
実行環境
$ python --version
Python 3.9.4
$ pip freeze
matplotlib==3.4.3
mplfinance==0.12.7a17
numpy==1.19.1
pandas==1.1.2
xlwings==0.20.5
データ読み込みと描画の準備
この記事では、日経平均株価のチャートを表示するという例を使い、Excelへグラフ表示する方法を解説します。
まずはデータを読み込んで、グラフを準備するところから。
データの読み込みは xlwings でExcelから読み出してもよいですし、CSVなどから読み込んでもどちらでもOKです。matplotlib で Figure を生成するところまでは、普段 Jupyter notebook 等でグラフ作る流れと全く一緒です。
サンプルデータ(日経平均株価)
解説にあたって、サンプルデータとして日経平均株価を使用します。
今回はYahoo! finance(米)でダウンロードしたcsvファイルを用います。Download をクリックするだけでダウンロードできます。
^N225 29,544.29 -639.67 -2.12% : Nikkei 225 - Yahoo Finance
これ以外でも、日時(または日付)とOHLC(始値・高値・安値・終値)があれば、どんなデータでもOKです。
Excelから読み込み
以下のサンプルコードは、アクティブになっているExcelシートのA1セル以降の範囲を取得し、DataFrameへ変換します。
DataFrame.dropna()
を用いて、nan値のある行を除外しています。
import pandas as pd
import xlwings as xw
active_app = xw.apps.active
wb = active_app.books.active
sheet = wb.sheets.active
hist = sheet.range('A1').options(pd.DataFrame, expand='table').value
hist.columns = ['Open', 'High', 'Low', 'Close', 'Adj_Close', 'Volume']
hist.dropna(inplace=True)
CSVファイルから読み込み
CSVから読み込む場合も、一般的な pandas.read_csv()
などを使ってDataFrameを取得します。
今回使うデータは1列目 'Date' をDatetimeIndexとして使いたいので、index_col='Date'
、parse_dates=True
としています。
FILE_SRC = './data/^N225.csv'
hist = pd.read_csv(FILE_SRC, index_col='Date', parse_dates=True)
hist.columns = ['Open', 'High', 'Low', 'Close', 'Adj_Close', 'Volume']
hist.dropna(inplace=True)
Excelにグラフ表示
matplotlibを使ってグラフ(今回は株価折れ線チャート)を用意します。
後でFigureオブジェクトをxlwingsに渡すので、以下のようにしています。
ここでは試しにpyplot.show()
で普通にグラフを表示してみます。
import matplotlib.pyplot as plt
plt.style.use('ggplot')
fig = plt.figure(figsize=(17,10))
plt.plot(hist['Close'], label='N225 Close', color='b')
plt.title('Stock Index')
plt.show()
ここで表示されたグラフ画像を、Excelのsheet上に表示させるには sheet.pictures.add()
を用います。
sheet = xw.Book().sheets[0]
sheet.pictures.add(fig, name='StockPrice')
余談ですが、DataFrameデータをローソク足(Candle sticks)で表示することも可能です。
今回はmplfinanceというライブラリで手軽に実装してみます。
別途モジュールのインストールとimportが必要。
$ pip install mplfinance
mplfinanceはmatplotlib、pandasにも依存しているのでこれらもインストールが必要。
以下のようにしてFigureオブジェクトを取得し、Excelへ展開します。
mpf.plot()
は何も指定しなければmatplotlibと同様にチャートを表示しますが、引数 returnfig=True
を渡すとFigure, Axesを取得できます。
import mplfinance as mpf
d = hist[['Open', 'High', 'Low', 'Close']]
fig, axs = mpf.plot(d, figratio=(12,4), mav=(5, 25), style='yahoo', type='candle', returnfig=True)
# 新規シートの場合
sheet = xw.Book().sheets[0]
# 開いているシートの場合
sheet = wb.sheets.active
sheet.pictures.add(fig, name='MyPlot')
リポジトリには豊富なexamplesがあるので参考にしてみてください。
matplotlib/mplfinance: Financial Markets Data Visualization using Matplotlib
今回参考にしたページ・資料
MatplotlibおよびPlotly Charts - xlwings Documentation
python - How to edit the fig with the new mplfinance package - Stack Overflow