先日、Dockerを使ったデータサイエンス環境を作りました。
この環境には日本語のフォントが入っていないし、日本語のフォントを使う設定もされていないので、matplotlibで日本語を含む図を描こうとすると化けてしまいます。
まぁ、英語だけでも良いか・・・という思うところもあるのですが、執筆や研修講師のお仕事もあるので、そんなときはやっぱり日本語で表示したいところです。もちろん、自分自身の用途でも日本語でラベルなどが表示されていた方が分かりやすいですしね。
そこで、日本語で作図できるようにしたいと思います。
Noto Sans CJK JPのダウンロード
jupyter/data-science
イメージには日本語のフォントが入っていないので、まずはNoto Sans CJK JPというフォントのダウンロードから始めましょう。
Googleのこちらのサイトからダウンロードできます。
こちらのサイトで「Noto Sans CJK JP」を検索して、ダウンロードします。
以前のデータサイエンス環境を作るときの記事に書いたように、Dockerコンテナ上の/home/jovyan
にローカルのフォルダをマウントしていると思います。そのフォルダの直下に.fonts
というフォルダ(コンテナ側で/home/jovyan/.fonts
と見える)を作成し、ダウンロードしたファイルを展開するとみつかるotfという拡張子のファイルを配置します。
Dockerコンテナのデータサイエンス環境で稼働しているJupyter Notebookを開き、下記のプログラムを実行します。
!fc-list
これはOS(Dockerコンテナ)側で認識しているフォントの一覧が表示されます。
このように、/home/jovyan/.fonts
配下のNoto Sans CJK JPフォントが見つかればOKです。
matplotlibrcファイルの作成
次に、ノートブックで下記のプログラムを実行します。
import shutil
from matplotlib import matplotlib_fname
shutil.copyfile(matplotlib_fname(), 'matplotlibrc')
すると、ノートブックファイルと同じディレクトリに、matplotlibrc
というファイルができます。このファイルを、コンテナ側で/home/jovyan/.config/matplotlib/matplotlibrc
となるように、ディレクトリを作成し移動します。
次に、このmatplotlibrc
ファイルを下記のように編集します。
# このような箇所があります
#font.sans-serif : DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
# 先頭にNoto Sans CJK JPを追記します
font.sans-serif : Noto Sans CJK JP, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
フォントマネージャのリビルド
再びJupyter Notebookを開き、下記のプログラムを実行します。
import os
import numpy as np
from matplotlib import pyplot as plt, font_manager
font_manager._rebuild()
ここでカーネルのリスタートをすると良いでしょう。
日本語を含む図表を描画
このようなプログラムで適当なグラフを描きます。
np.random.seed(0)
x = range(5)
y = 10 + 5 * np.random.randn(5)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('日本語を指定したタイトル')
ax.bar(x, y)
plt.show()
このように日本語を含む図表を描くことができました!