Python

pandas_profiling で列名が日本語のときに相関プロットのラベルが豆腐(文字化け)になるのをなんとかする

どういうこと?

列名が日本語のデータを

input.csv
列1,列2
1,3
2,4
3,3
4,4

pandas-profilingにかけると

import pandas as pd
import pandas_profiling

df = pd.read_csv('input.csv')
prof = pandas_profiling.ProfileReport(df)
prof.to_file('output.html')

相関のプロットのラベルに含まれる日本語が文字化けして豆腐になります。
matplotlib でよく見るやつです。
image.png

環境によっては以下のようなエラーが出ます。(Ubuntuの場合)

UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans

エラーメッセージから matplotlib のエラーだと分かるので、以下のようにコードを変更してみましたが、うまくいきません。

import pandas as pd
import pandas_profiling

# フォント指定
import matplotlib
matplotlib.rcParams['font.family'] = 'MigMix 1M'

df = pd.read_csv('input.csv')
prof = pandas_profiling.ProfileReport(df)
prof.to_file('output.html')

フォントについて

MigMix 1M なのは趣味です。
Ubuntuでのフォントのインストールからmatplotlibへの反映までは以下を参照してください。

なぜ?

pandas-profiling Font family not found で検索すると Issue #95 · pandas-profiling/pandas-profiling · GitHub がヒットしました。
読んでみると、 pandas-profiling で用意している設定ファイル pandas_profiling.mplstyle で上書きされているようです。

どうすればいい?

pandas_profiling.mplstyle を上書きします。
場所は、 pandas_profiling.__file__ と同じディレクトリです。

ファイルの以下の部分を

font.family: sans-serif
font.sans-serif: Arial, Liberation Sans, Bitstream Vera Sans, sans-serif

次のように変更します。

font.family: sans-serif
font.sans-serif: MigMix 1M, Arial, Liberation Sans, Bitstream Vera Sans, sans-serif

font.family: sans-seriffont.family: MigMix 1M にするのでもいいかもしれません。

再度実行するとプロットに日本語が表示されます。
image.png

pandas_profiling.ProfileReport の引数あたりで matplotlib.rcParams 形式が指定できるようになると楽だと思います。