今さらこの記事を書く意義は?
これまでも同様の無いようでQiitaにも多数の記事が投稿され、Webでも検索すれば、数えきれないほどの資料が見つかりますが、あえて少し視点を変えて、解説させていただきます。
ここでは、特にGoogle ColaboratoryとWatson Studioという、基本的にデータを永続化出来ない環境でのMatplotlibを想定した日本語フォントを導入方法を紹介します。
Google Colaboratoryに関しては、Androidのユーザーであれば必ずと言っていいほど登録済みのGooleアカウントでサイトにアクセスして、利用規約に同意するだけで容易に新規ノートブックを作成していただけます。
IBM Cloudに関しては、アカウントお持ちで無い方が多いとは思いますが、サインアップは済んでいるものとして進めさせていただきます。
始めに、ご存じ無い方のためにWatson Studioを開始するまでの手順をかいつまんで解説しておきます。まずはログイン後のダッシュボードの画面の右上にあるリソースの追加をクリックします。
次のカタログの画面で、左側のカテゴリーのリストからAI / Machine Learningを選びます。
作成画面に遷移しますと、任意でロケーションを変更可能ですが、右下の使用条件に同意さえすれば、無料プランで作成ボタンがクリック出来るようになります。
サービスが作成され、ページが変わったら、Launch in Cloud Pak for Dataというボタンをクリックします。
ようこその画面になりますので、新規にプロジェクトを作成します。
プロジェクトの作成では、差し当たり空のプロジェクトを選択します。
次は任意のプロジェクト名を入力すれば、作成ボタンがアクティブになります。
プロジェクトのトップページが表示されたら、プロジェクトに追加ボタンで資産タイプの選択が出現されるのでNotebookを選びます。
後はNotebook名を入力するだけです。ランタイムは特に高いスペックを必要としないのであれば、低いスペックにしておいたほうが、稼働時間を長くできます。
白紙のNotebookが表示されたら準備完了です。お疲れさまでした。早速コードを入力して実行してみましょう。
まず日本語フォント未登録だと、どうなるか...
単なるサンプルなので意味の無いデータですが、今回は以下のコードをセルに入力し、グラフを表示します。
import numpy as np
x = np.arange(-np.pi, np.pi, 0.25)
from matplotlib import pyplot as plt
plt.plot(x, np.sin(x), marker='o', label=u'sinカーブ', color='gray')
plt.plot(x, 2*np.sin(x), marker='x', label=u'sin2カーブ', color='red')
plt.plot(x, np.cos(x), marker='.', label=u'円周率π', color='blue')
plt.xlabel(u'スケール')
plt.ylabel(u'ラジアン')
plt.legend()
plt.figtext(x=0, y=0, s=u'三角関数')
plt.grid(axis='x', color='pink', alpha=0.5, linewidth=1, linestyle='--')
plt.grid(axis='y', color='cyan', alpha=0.5, linewidth=1, linestyle=':')
すると大量のエラーが出力された後、全角のフォントがいわゆる「豆腐」の状態となり、それぞれ以下のように表示されます。
Plotに日本語フォントを一括適用する
日本語フォントはそれぞれ好みのものを選択して構いませんが、ここでは直接リンクからZipファイルをダウンロードできるSource Han Code JPを採用します。
まず下記のコードでダウンロードしてから、目的のファイルを抽出し保存します。
import requests
from zipfile import ZipFile
from io import BytesIO
from matplotlib import font_manager as fm
font_url = 'https://github.com/adobe-fonts/source-han-code-jp/archive/2.011R.zip'
font_zip = requests.get(font_url)
font_set = BytesIO(font_zip.content)
font_path = 'source-han-code-jp-2.011R/OTF/SourceHanCodeJP-Regular.otf'
ZipFile(font_set, 'r').extract(font_path)
font_set.close()
さらに、フォントファイルをfont_manager
に登録した上で、matplotlib.pyplot
に既定のフォントとして一括適用します。
手っ取り早く日本語フォントを表示するためだけであれば、これでよいのではないかと思います。
from matplotlib import pyplot as plt, font_manager as fm
fm.fontManager.addfont(font_path)
font_prop = fm.FontProperties(fname=font_path)
plt.rc('font', family=font_prop.get_name())
実際に日本語フォントを表示してみる。
準備が出来たところで、冒頭のコードを同じように実行すると、それぞれ以下のように表示されます。
個別にフォントの設定を調整する場合
グラフの見栄えにこだわるのであれば、font_properties
というパラメータにmatplotlib.font_manager.FontProperties
を渡すことにより、個別にフォントを調整することが出来ます。
下記にフォントのサイズや太さを変更するサンプルを示します。
x = np.arange(-np.pi, np.pi, 0.25)
plt.plot(x, np.sin(x), marker='o', label='sinカーブ', color='gray')
plt.plot(x, 2*np.sin(x), marker='x', label='sin2カーブ', color='red')
plt.plot(x, np.cos(x), marker='.', label='円周率π', color='blue')
font_prop.set_size(12.0)
plt.xlabel('スケール', font_properties=font_prop)
plt.ylabel('ラジアン', font_properties=font_prop)
font_prop.set_size(18.0)
font_prop.set_weight('extra bold')
plt.figtext(x=0, y=0, s='三角関数', font_properties=font_prop)
plt.grid(axis='x', color='pink', alpha=0.5, linewidth=1, linestyle='--')
plt.grid(axis='y', color='cyan', alpha=0.5, linewidth=1, linestyle=':')
font_prop.set_size(9.0)
font_prop.set_weight('ultralight')
plt.legend(prop=font_prop)
終わりに
毎回、フォントファイルの入手からの作業となることを念頭に、出来るだけ小さいオーバーヘッドで、かつ汎用的に利用出来るコードとなるよう、配慮したつもりです。
実際のところ、普段は下記の記事に書いているようにGoogle Cloud ShellでJupyter Labを利用しています。
そのためGoogle ColaboratoryもWatson Studioも最近はほとんどアクセスすることがありません。今回の記事を書くために久々に利用したので、少し新鮮に感じられました。