Python Tech xlwings

[Python] Excelにmatplotlibで描画したグラフを表示 [xlwings]

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

 

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech, xlwings
-, , , , , ,