背景
-
データ分析環境を手軽にスクラップアンドビルドしたくてDockerを導入したのだが、SeabornやMatplotlibで日本語フォントを使ったグラフがかけなくて困っていた。
-
一般的にWeb上にある解決法ではなぜか全く解決しなかった(Windows上のNativeのAnaconda環境でSeabornの日本語設定するなど)。
-
最終的な解決方法がすごくスマートだったので記念に記録
環境
- ホストOS:Windows10 + WSL2
- Docker desktop, base image: continuumio/anaconda3
- 上記イメージを普通にdocker run
- VScodeのRemote Containersで上記コンテナにリモート接続
- VScodeで立ち上げたターミナルで色々どうにかしようとした
方法
- こういったページの方法を試して、手動でフォントをダウンロードしたりmatplotlibの設定を変えたが全然だめだった
sample.ipynb
import matplotlib.font_manager as fm
fm.findSystemFonts(fontpaths=None, fontext='ttf')
# これでなぜか空のリストが返されてフォントが無いことになっている
- 以下のページを読んでいて、「確かにそもそもコンテナの中に最初からフォントがインストールされてるといいのでは?」と思いつく
- おなじみ「もみじあめ」さんのサイトにたどり着く
- 実際には以下の通りの手順
Dockerfileの作成
Dockerfile
# ベースイメージ
FROM continuumio/anaconda3
# 必要なフォントのインストール
# 最初のapt updateは必須
RUN apt update
RUN apt -y install fonts-ipaexfont
RUN apt autoremove -y
RUN apt clean -y
# 作業ディレクトリの作成
WORKDIR /project_dir
日本語フォント入りのAnaconda3イメージの作成
VScodeのシェル上で以下のコマンド
# Dockerfileのおいてあるディレクトリで実行
docker build -t anaconda_with_jpfont .
コンテナの作成
VScodeのシェル上で以下のコマンド
docker run -it --net='host' --mount type=bind,src="/mnt/c/Users/自分のユーザー名/マウントしたいフォルダ",dst=/project_dir anaconda_with_jpfont
VScodeからコンテナへリモート接続
ここ見て
ipynb内での作業
sample.ipynb
# 心配な人はこちらで実際にインストールされているフォントを確認
import matplotlib.font_manager as fm
fm.findSystemFonts(fontpaths=None, fontext='ttf')
# ['/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf',
# ...
# '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf']
# みたいな
# ないしはこちらで確認
import matplotlib as mpl
font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)
# ['IPAexGothic', 'IPAexMincho', 'IPAexMincho', 'DejaVu Serif', 'DejaVu Sans', 'DejaVu Serif', 'DejaVu Sans Mono', 'DejaVu Sans', 'DejaVu Sans Mono', 'IPAexGothic']
# seabornのipynb内での使用フォントを設定してから描画
sns.set(font='IPAexGothic')
sns.barplot(x, y, data)
# matplotlibのフォントを設定してから描画
import matplotlib as mpl
mpl.rcParams['font.family'] = 'IPAexGothic'
plt.plot(x, y)
plt.xlabel('日本語!')
ipynbの最初に毎回指定するのは手間ですが、matplotlibrcやseabornの.pyファイルを書き換えないで良いので環境を破壊せず再現性もあり、スマートだと思いました。