【python】matplotlibでグラフを日本語表記にする方法

生物系工学博士がpython玄人になるまで。その3ではデータ解析のためにグラフの描画を行なった際に、日本語が文字化けするエラーに見舞われたので、解決まで行なったことをアウトプットしていきます。

pythonのmatplotlibでグラフを描画すると日本語が文字化けする

matplotlibで実際にグラフを描画してみました。
今回使用するグラフについては、下記のページを参考にさせていただきました。

scipyでピーク値の抽出
https://qiita.com/wrblue_mica34/items/e174a71570abb710dcfb

コードは以下の通りになります。

import matplotlib
matplotlib.use('Qt4Agg')

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
yorg = np.sin(x)
y = yorg + np.random.randn(100)*0.2

#ピーク値のインデックスを取得
maxid = signal.argrelmax(y, order = 1) #最大値
minid = signal.argrelmin(y, order = 1) #最小値

plt.plot(x,yorg,'r', label = 'オリジナルsin')
plt.plot(x,y, 'k-', label = '元系列')
plt.plot(x[maxid], y[maxid], 'ro', label = 'ピーク値')
plt.plot(x[minid], y[minid], 'bo', label = 'ピーク値(最小)')
plt.legend()

plt.show()

実際に描画されたグラフが下図になります。

「オリジナルsin」や「元系列」の部分が「□□□□□sin」や「□□□」と表記されてしまっています。
これは元々のmatplotlibの設定フォントが日本語に設定されていないからだそうです。

matplotlibでAppleGothicのフォントを使用する

そこでフォントの設定を行いました。
下記のページを参考にしました。

matplotlibで日本語
https://qiita.com/yniji/items/3fac25c2ffa316990d0c

フォントの指定として日本語に対応している「AppleGothic」を使用しました。

下記のコードを挿入します。

mport matplotlib as mpl
font = {"family":"AppleGothic"}
mpl.rc('font',**font)

全文は下記の通りになります。

import matplotlib
matplotlib.use('Qt4Agg')

import matplotlib as mpl
font = {"family":"AppleGothic"}
mpl.rc('font',**font)

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
yorg = np.sin(x)
y = yorg + np.random.randn(100)*0.2

#ピーク値のインデックスを取得
maxid = signal.argrelmax(y, order = 1) #最大値
minid = signal.argrelmin(y, order = 1) #最小値

plt.plot(x,yorg,'r', label = 'オリジナルsin')
plt.plot(x,y, 'k-', label = '元系列')
plt.plot(x[maxid], y[maxid], 'ro', label = 'ピーク値')
plt.plot(x[minid], y[minid], 'bo', label = 'ピ-ク値(最小)')
plt.legend()

plt.show()

こうすることによって日本語が対応するかと思いましたが、「ー」がまだ文字化けしています。
半角にすると行けるのですが、見栄えが悪いので、さらに解決する方法を探しました。

matplotlibでIPAexゴシックを使用する方法

下記のページの情報によるとIPAexゴシックというフォントが良いそうです。

matplotlib のグラフに日本語を表示する方法(文字化け対応)
https://akiyoko.hatenablog.jp/entry/2017/04/11/080446


Macにおけるmatplotlibの日本語表示
https://openbook4.me/sections/1674

というわけで下記のページからIPAexのフォントをインストールします。

IPAexフォント IPAフォント
https://ipafont.ipa.go.jp/

ダウンロードした「ipaexg.ttf」のファイルを/Library/Fonts/に移動して、フォントのインストールを行います。

そして「IPAexGothic」を指定してグラフを描画します。
下記のように変更します。

mport matplotlib as mpl
font = {"family":"IPAexGothic"}
mpl.rc('font',**font)

ところがまた日本語が全て□になってしましました。

フォントのキャッシュの削除

色々と調べてみたところ、フォントのキャッシュがうまく消えていないそうです。
そこで、ターミナルに

rm .matplotlib/*.cache

と入力してキャッシュの削除を行いました。
しかし、これでは解決することができませんでした。
エラーを見ると
Font family [‘IPAexGothic’] not found. Falling back to DejaVu Sans.
というように指摘されています。

さらに調べてみて下記のページに有用な情報が記載されていました。

matplotlib にフォントが無いと怒られる場合の対処
https://qiita.com/f0o0o/items/c2f74ac1d27e48d0fed1

~/.cache/matplotlib/ に fontlist-v300.json というファイルがあるそうそうで、これを削除すると良いそうです。
ちなみに、.cacheは隠しフォルダになります。

matplotlibで日本語設定ができました

というわけで、fontlist-v300.jsonを削除して、下記コードを実行しました。

 import matplotlib
 matplotlib.use('Qt4Agg')

 import matplotlib as mpl
 font = {"family":"IPAexGothic"}
 mpl.rc('font',**font)

 import numpy as np
 from scipy import signal
 import matplotlib.pyplot as plt

 x = np.linspace(0, 10, 100)
 yorg = np.sin(x)
 y = yorg + np.random.randn(100)*0.2

 #ピーク値のインデックスを取得
 maxid = signal.argrelmax(y, order = 1) #最大値
 minid = signal.argrelmin(y, order = 1) #最小値
 
 plt.plot(x,yorg,'r', label = 'オリジナルsin')
 plt.plot(x,y, 'k-', label = '元系列')
 plt.plot(x[maxid], y[maxid], 'ro', label = 'ピーク値')
 plt.plot(x[minid], y[minid], 'bo', label = 'ピーク値(最小)')
 plt.legend()
 
 plt.show()

これで無事にmatplotlibで日本語が使用できるようになりました。

本記事にて参考にさせていただきましたページにつきまして、この場を借りてお礼申し上げます。

コメント

  1. 匿名希望 より:

    japanize-matplotlib を使ってはどうでしょう?
    https://github.com/uehara1414/japanize-matplotlib

    • ろーか ろーか より:

      コメントいただきありがとうございます。
      早速確認させていただきました。本記事で行なっていたフォントの設定をimport japanize_matplotlibで一括でできてしまうという解釈でよろしいですかね?
      素晴らしい情報を教えていただきありがとうございました。勉強になります。

タイトルとURLをコピーしました