matplotlibでの日本語表示 on AWS Lambda
matplotlib
pythonでグラフを描画するときに利用するライブラリがmatplotlibです。pythonは様々なデータ処理が得意なので、同じプログラムでグラフなど見える形でアウトプットできるのはありがたいです。GMTのような描画専用ソフトだと、プログラムで処理した結果を出力して、それを読み込んで描画するので、その手間がなくなるのがメリットかなと思います。
とはいえ、見た目だけの調整が多いケースなどでは、描画部分だけをくり返し実行したいので、GMTも便利です。それぞれ使いどころを分けるのは大事ですね。
pythonでもjupyterlabを使えば、描画部分だけを繰り返し処理もできますし。
pythonでも地図を描きたい場合には、地図描画ライブラリであるcartopyを使います。matplotlibとcartopyで何が描けるかは、以下の公式ページにgalleryがありますので参考まで。
GMTでの描画は好きなんですが、最近はpythonを使うことが多いので図化もmatplotlibを使うことが多くなりました。ここでも日本語でラベルやタイトルを書きたいということはよくあるので、日本語フォントの設定方法を整理します。
japanize-matplotlibを使うと日本語が書けるらしいですが、前回フォントファイルを使ったので、matplotlibでもフォントファイルを読み込ませる方法を調べました。
環境
今回、私が実行した環境はLinuxとAWS Lambdaです。また、pythonとライブラリのバージョンは以下です。
(Linux)
- OS:CentOS 8
- python:3.9.9
- matplotlib:3.5.1
- Cartopy:0.19.0.post1
(AWS Lambda)
- OS:AWS Lambda
- python:3.9
- matplotlib:3.5.1
- Cartopy:0.19.0.post1
matplotlibでの日本語フォントの設定方法
matplotlibでも、Ghostscriptのように日本語フォントを読み込んで利用する形です。
日本語フォントは、ここでもIPAexフォントを使います。ダウンロードなどはこちらの記事と同じで、使うフォントファイルは以下の2つです。
- 明朝体 ipaexm.ttf
- ゴシック体 ipaexg.ttf
フォントの読み込みは、font_managerというモジュールで行います。
あとは、利用するときに設定したプロパティを呼び出します。
import matplotlib.font_manager as fm
# 日本語フォント(IPAex)の設定
fprop_g = fm.FontProperties(fname='./IPAexfont00401/ipaexg.ttf')
fprop_m = fm.FontProperties(fname='./IPAexfont00401/ipaexm.ttf')
# タイトルを記載する
title = 'タイトル'
ax.set_title(title,fontproperties=fprop_g)
今回は、タイトルに日本語フォントを適用しましたが、判例や軸ラベルなど日本語を使いたいところでfontpropertiesを設定できます。この方法で作成した画像が以下です。
ちゃんと日本語表示できてます。
AWS Lambdaで動くmatplotlibで日本語を表示させる
Linux上で描画できましたので、発展版としてAWS Lambda(以下、Lambda)で描画させるときの注意点をまとめておきます。Lambdaとは、Amazon Web Service(AWS)のサーバーレスでイベント駆動型のサービス名称です。システムをサーバレスで構築する際の中心となるサービスです。AzureではAzure Functions、GCPではCloud Functionsに対応するサービスです。
Lambdaでは、ソースプログラムをクラウド上にアップロードしておき、トリガーとなるイベントが発生したときに仮想環境が一時的に構築され、アップロードしてあるソースプログラムが実行されます。そのため、必要なファイルはソースプログラムと同じくパッケージ化しておくか、外部からダウンロードなどで都度取得する必要があります。日本語フォントファイル(ttf)も一緒にパッケージ化する場合は、上述したLinuxでの動作したプログラムのままで大丈夫です。
ただし、日本語フォントのように他のLambda関数でも利用するようなファイルは、Lambdaの場合だとLayerを利用すると汎用的だと思います(Lamda上のmatplotlibで日本語対応する)。
もう1つは、Elastic File Sytem(EFS)に配置しておいて、Lambdaからmountさせる方法もあります。EFSは、AWSのクラウド版NASです。2020年のアップデートでLambdaからEFSが使えるようになり、めちゃ便利になりました。設定方法などは別途まとめたいと思いますが、例えばEFSを/mnt/EFSとしてmountしてある場合には、以下のような書きぶりになります。
# 日本語フォント(IPAex)の設定
fprop_g = fm.FontProperties(fname='/mnt/EFS/IPAexfont00401/ipaexg.ttf')
fprop_m = fm.FontProperties(fname='/mnt/EFS/IPAexfont00401/ipaexm.ttf')
これで、Lambda上でもmatplotlibで日本語表示が可能になります。
ここまでGMT+Ghostscript、matplotlibで日本語表示をする方法をまとめてみると、フォントファイルって何者?という疑問が湧いてきました。この内容は次の記事でまとめようと思います。
Discussion