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環境のカスタムイメージを作成することで、予めフォントを導入済みの環境を作ることができるようです。もしうまく行けば、それが恒久策として使えそうです。機会があればチャレンジします。