0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VScode + Remote Containers + Anaconda3ベースDockerコンテナのJupyternotebook上で日本語のグラフを描く

Posted at

背景

  • データ分析環境を手軽にスクラップアンドビルドしたくて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ファイルを書き換えないで良いので環境を破壊せず再現性もあり、スマートだと思いました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?