よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【japanize-matplotlib】WSL-Ubuntuでmatplotlibの「豆腐」文字化け解消法

WSL:Ubuntuでのmatplotlibを日本語化


グラフ作成ライブラリmatplotlibのデフォルト設定では、タイトルやラベルなどを日本語で書くといわゆる「豆腐」と言われる文字化けで上手く表記できません。

「豆腐」文字化けを解消する方法として色んなサイトや本で解説されているのは、日本語のfontをダウンロードし設定し云々・・・というものがほとんどです。以前にWindowsにAnacondaを入れていた時もそれで上手く行きました。
しかし、WSLのUbuntuにAnacondaを入れ直して同じことをやってみたのですが、どうも上手く行かない。

今回はライブラリjapanize-matplotlibをインストールして上手く行った方法をメモしておきます。



【実行環境】

  • Windows10 WSL:Ubuntu
  • Anaconda
  • Python3.8
  • JupyterNotebook
  • VSCode

「豆腐」文字化けの例

まずは普通にグラフを表示する。次のように文字化けする。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
np.random.seed(0)
# データ(20行2列のランダムなデータ)
df = pd.DataFrame(np.random.rand(20,2))

# 背景色を白にする(notebookの背景色を黒に変えている為です)
plt.figure(facecolor='w') 

# 1列目をプロットする
plt.plot(df.iloc[:,0], label='1列目')
# 2列目をプロットする
plt.plot(df.iloc[:,1], label='2列目')

# タイトルを日本語で書く
plt.title('日本語ラベルテスト')

# ラベルを日本語で書く
plt.xlabel('日本語Xラベル')
plt.ylabel('日本語Yラベル')

# 凡例を日本語で設置
plt.legend()

# 画像保存
plt.savefig('文字化けグラフ.jpg')

plt.show()
/home/user/anaconda3/lib/python3.8/site-packages/matplotlib/backends/backend_agg.py:238: RuntimeWarning: Glyph 26085 missing from current font.
  font.set_text(s, 0.0, flags=flags)
/home/user/anaconda3/lib/python3.8/site-packages/matplotlib/backends/backend_agg.py:238: RuntimeWarning: Glyph 26412 missing from current font.

(中略)

  font.set_text(s, 0.0, flags=LOAD_NO_HINTING)


20210618162548
文字化け豆腐

このように日本語で書いた部分が文字化けする。



japanize-matplotlibで文字化け解消

次はjapanize-matplotlibというライブラリをインストール・インポートして、上と全く同様のコードを実行してみます。

ライブラリのインストールはconda installではできなかったので次のようにしました。

$ python -m pip install japanize-matplotlib

ライブラリ名はjapanize-matplotlibですが、importする時はハイフンをアンダーバーに変えてjapanize_matplotlibとします。

# 日本語化のライブラリをインポート
import japanize_matplotlib

# データ(20行2列のランダムなデータ)
df = pd.DataFrame(np.random.rand(20,2))

# 背景色を白にする(notebookの背景色を黒に変えている為です)
plt.figure(facecolor='w') 

# 1列目をプロットする
plt.plot(df.iloc[:,0], label='1列目')
# 2列目をプロットする
plt.plot(df.iloc[:,1], label='2列目')

# タイトルを日本語で書く
plt.title('日本語ラベルテスト')

# ラベルを日本語で書く
plt.xlabel('日本語Xラベル')
plt.ylabel('日本語Yラベル')

# 凡例を日本語で設置
plt.legend()

# 画像保存
plt.savefig('文字化け解消グラフ.jpg')

plt.show()

f:id:chayarokurokuro:20210618153232j:plain

上手く日本語で表示されました!



おわりに

今回の方法では毎回インポートするのが面倒ではあるものの、japanize-matplotlibをインストールするだけで済み、フォントをダウンロードしたり設定ファイルを書き直したりしなくてよいので最も簡単。WSL以外でもこれが使えます。

以上です。