Python
matplotlib
pandas

pandas-profiling に matplotlib の設定を上書きされる問題とその回避方法

pandas-profiling はデータの特徴をざっくり眺めるときに使うとても便利なライブラリ1なのだが、プロファイルを実行すると matplotlib の設定を上書きされるという厄介な問題がある。

設定を上書きされる問題

まずは普通に matplotlib を使ってグラフを表示してみる。

import matplotlib
import matplotlib.pyplot as plt

%matplotlib inline

matplotlib.rcParams['font.family'] = 'TakaoPGothic'
matplotlib.rcParams['figure.figsize'] = (8, 4)
plt.style.use('ggplot')
from sklearn import datasets

iris = datasets.load_iris()
plt.scatter(iris.data[:, 2], iris.data[:, 3], c=iris.target)
plt.xlabel('花弁の長さ (cm)')
plt.ylabel('花弁の幅 (cm)')
plt.show()

問題なくプロットした画像が表示されている。

続いて、pandas-profiling を使った後にもう一度同じグラフをプロットしてみる。

import pandas as pd
import pandas_profiling as pdp

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target_names[iris.target]

pdp.ProfileReport(df)  # レポートが表示される
plt.scatter(iris.data[:, 2], iris.data[:, 3], c=iris.target)
plt.xlabel('花弁の長さ (cm)')
plt.ylabel('花弁の幅 (cm)')
plt.show()

グラフの色も大きさも違うし、何より日本語が豆腐になってしまっている。

原因

pandas-profiling は、プロファイルの実行時に matplotlib の設定を上書きするらしい。

Change default font size and plot sizes · Issue #95 · pandas-profiling/pandas-profiling

オプションで挙動を変えることもできなさそうなので、pandas-profiling そのものを直すしかなさそう。

回避方法

だいぶ苦しい方法だが、rcParams を一時的に避難させておいてプロファイルを実行した後に元に戻すことで回避できる。

def profile_report(df):
    params = matplotlib.rcParams.copy()
    report = pdp.ProfileReport(df)
    matplotlib.rcParams.update(params)
    return report
profile_report(df)  # レポートが表示される

これで他のグラフに影響を与えることなくプロファイルを実行できる。

ただし、この回避方法では「プロファイルレポートそのものの日本語が豆腐になる」問題は解決できていないので、その場合は pandas-profiling の設定ファイルを直接書き換える必要がある。2