生物系工学博士が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で日本語が使用できるようになりました。
本記事にて参考にさせていただきましたページにつきまして、この場を借りてお礼申し上げます。
コメント
japanize-matplotlib を使ってはどうでしょう?
https://github.com/uehara1414/japanize-matplotlib
コメントいただきありがとうございます。
早速確認させていただきました。本記事で行なっていたフォントの設定をimport japanize_matplotlibで一括でできてしまうという解釈でよろしいですかね?
素晴らしい情報を教えていただきありがとうございました。勉強になります。
[…] https://kagakunomemocho.com/python-matplotlibja/ […]