Cloud Pak for DataのNotebookでmatplotlibのグラフ日本語文字化けを解消する


matplotlibやseabornでグラフを書いた時に、グラフの日本語が文字化けして以下のように豆腐(□□□)になることがあります。

これは環境に日本語フォントが入っていなかったり、適切に設定されていないことが原因で、matplotlib/seaborn固有の問題です。解決策は他の記事でも解説されていますが、これをCloud Pak for Data (以下CP4D)上で解決する方法です。

環境: CP4D v2.5, v3.0LA

CP4Dでは、Notebookで起動するPython環境は予め用意されており、かつランタイムを起動するたびに初期状態で起動するため、一度Python環境に設定すれば未来永劫OKというわけには行きません。
暫定策として、Notebook内で解決策(フォントのダウンロードと設定変更)を実施します。

matplotlibの日本語文字化け対応策 (CP4D版)

以下のコードをNotebookの先頭で実行します。フォントは先の記事にもあったIPAのフォントを使った例です。

# download and install a Japanese font
!cd /tmp; curl -O https://ipafont.ipa.go.jp/IPAexfont/ipaexg00401.zip
!unzip -jo /tmp/ipaexg00401.zip -d ~/.fonts
# register the font
!fc-cache -fv; fc-list
# reset the matplotlib cache
!rm -rf ~/.cache/matplotlib

(オプション) 上記の実行後、以下のコードでmatplotlibが認識できるフォントにIPAexGothicが追加されたことを確認します。これを見ると、元々CP4DのデフォルトPython環境ではDejaVu Sansしか無かったことが分かります。

import matplotlib.font_manager;
[matplotlib.font_manager.FontProperties(fname=fname).get_name() for fname in matplotlib.font_manager.get_fontconfig_fonts()]
# -output-
#['DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'DejaVu Sans',
# 'IPAexGothic']

グラフを書く前に、rcParamsでfont.familyを指定すればOKです。

from matplotlib import pyplot as plt
from matplotlib import rcParams
plt.rcParams['font.family'] = 'IPAexGothic'

実行例

# download and install a Japanese font
!cd /tmp; curl -O https://ipafont.ipa.go.jp/IPAexfont/ipaexg00401.zip
!unzip -jo /tmp/ipaexg00401.zip -d ~/.fonts
# register the font
!fc-cache -fv; fc-list
# reset the matplotlib cache
!rm -rf ~/.cache/matplotlib
# -output-
# 省略
サンプルデータを用意
import pandas as pd
df = pd.DataFrame({
    'あいうえお' : [1,2,3,4,5],
    'カキクケコ' : [0.1,0.2,0.3,0.4,0.5],
    'サシスセソ' : [10,20,30,40,50],
    '漢字' : [100.1,100.2,100.3,100.4,100.5]
})
df
# -output-
#   あいうえお カキクケコ サシスセソ 漢字
# 0 1   0.1 10  100.1
# 1 2   0.2 20  100.2
# 2 3   0.3 30  100.3
# 3 4   0.4 40  100.4
# 4 5   0.5 50  100.5
グラフを描画
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import rcParams
import seaborn as sns

# Specify font
plt.rcParams['font.family'] = 'IPAexGothic'

sns.pairplot(df)

結果:


(追記) CP4D v3.0.1からは、Python環境のカスタムイメージを作成することで、予めフォントを導入済みの環境を作ることができるようです。もしうまく行けば、それが恒久策として使えそうです。機会があればチャレンジします。