Matplotlib
前にMatplotlibでグラフを描写するのには日本語は使えないというお話をしました。
自分で使う分には英語がそれほど苦ではないのでずっと英語表記で使っていたのですが、やはり人に渡すとなると日本語表記の方がわかってもらえやすいわけです。
ということでmatplotlibを日本語で使うにはどうしたらいいかを勉強してみました。
調べていくうちにどうやら3つほどやり方があるようですが、とりあえずそれほどめんどくさくなくできる2つの方法を使っていこうと決めましたので、今回はそのお話です。
基本のプログラム
ということでまずは基本となるプログラムを作成していきましょう。
import matplotlib.pyplot as plt
title = 'plot title'
xlabel = 'xlabel'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title , fontsize=30)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
「import matplotlib.pyplot as plt」でmatplotlibライブラリのうちpyplotをpltという名前で使えるようにインポートします。
次にタイトルを「title = ‘plot title’」、X軸名を「xlabel = ‘xlabel’」ととして変数にすることで簡単に書き換えられるようにし、またXとYの値を適当にリスト形式で作成しました。
「fig = plt.figure()」で画像の領域を確保、そして「plt.clf()」で一度クリアします。
「plt.plot(x, y)」でグラフのプロット、「plt.title(title , fontsize=30)」でタイトルの表示、「plt.xlabel(xlabel, fontsize=30)」でX軸名の表示(それぞれ見やすいようにfontsizeで大きくしています)、「plt.show()」でグラフの表示です。
この状態でタイトルとX軸名を日本語にしてみましょう。
import matplotlib.pyplot as plt
title = 'プロットタイトル'
xlabel = 'X軸名'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title , fontsize=30)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
確かに日本語の部分が□と文字化けしています。
方法その1:matplotlib.font_managerを使う
matplotlibにはフォントを扱う「font_manager」というものがあります。
これを使うことでグラフ上の表記のフォントを変更することができます。
もちろん日本語表記に変えるだけではなく、英語表記でも好きなフォントに変えることができます。
プログラムを書いてみるとこんな感じです。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
font_path = r'./NotoSansJP-Regular.otf'
fp = fm.FontProperties(fname=font_path)
title = 'plot title'
xlabel = 'xlabel'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title, fontsize=30, fontproperties=fp)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
フォントが少し変わったのが分かりますでしょうか。
この状態でタイトルに日本語を使ってみましょう。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
font_path = r'./NotoSansJP-Regular.otf'
fp = fm.FontProperties(fname=font_path)
title = 'プロットタイトル'
xlabel = 'X軸名'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title, fontsize=30, fontproperties=fp)
plt.xlabel(xlabel, fontsize=30, fontproperties=fp)
plt.show()
実行結果
確かに日本語を使うことができました。
この「matplotlib.font_manager」を使うには3ステップ必要です。
- matplotlib.font_managerのインポート「import matplotlib.font_manager as fm」
- フォントの読み込み「fp = fm.FontProperties(fname=font_path)」
- 各部位へのフォントの使用「plt.title(title, fontproperties=fp)」
インポート→読み込み→使用の流れなので分かりやすいと思います。
ただ注意点が2つあります。
- フォントの読み込みの際、フォントへのパスが必要
- フォントを使用する際、使用する部位にfontpropertiesの設定が必要
フォントに関してはPCのシステム内のフォントを指定することも可能ですが、なかなか探すのは面倒なため、個人的にはGoogle Fontsからダウンロードしてしまった方が早いと思っています。
また読み込んだフォントを使用する場合、それぞれの部位でfontpropertiesを設定する必要があります。
例えばX軸名のfontpropertiesのオプションを消してみましょう。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
font_path = r'./NotoSansJP-Regular.otf'
fp = fm.FontProperties(fname=font_path)
title = 'プロットタイトル'
xlabel = 'X軸名'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title, fontsize=30, fontproperties=fp)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
X軸名の日本語の部分だけ□に文字化けしてしまいました。
このように日本語を使いたい部分は全てfontpropertiesの設定が必要になります。
今回はタイトルとX軸名だけですが、他にも日本語を使いたい部分があれば、fontpropertiesを追加する必要があるので、多くなればなかなか面倒になってきます。
方法その2:plt.rcParams[‘font.family’]を使う
もう一つの方法としては「plt.rcParams[‘font.family’]」を使う方法です。
この場合、先ほどの「matplotlib.font_manager」を使うのとは異なり、この後で表示されるグラフ全てのフォントに効果があります。
つまり一つずつ設定する必要はありません。
ということでこんな感じです。
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Hiragino Sans'
title = 'plot title'
xlabel = 'xlabel'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title , fontsize=30)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
「plt.rcParams[‘font.family’] = ‘Hiragino Sans’」の部分でフォントを「Hiragino Sans」に指定しています。
今度はタイトルとX軸名を日本語にしてみましょう。
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Hiragino Sans'
title = 'プロットタイトル'
xlabel = 'X軸名'
x = [0, 1, 2, 3, 4, 5]
y = [0, 2, 4, 6, 8, 10]
fig = plt.figure()
plt.clf()
plt.plot(x, y)
plt.title(title , fontsize=30)
plt.xlabel(xlabel, fontsize=30)
plt.show()
実行結果
タイトルもX軸名も問題なく日本語になりました。
plt.rcParams[‘font.family’]はフォントの指定が難しい
plt.rcParams[‘font.family’]でプロット内全ての日本語がちゃんと表示されるなら、こちらのがいいじゃないかと思うかとも多いことでしょう。
でも私が最初に使い始めたのは方法その1の「matplotlib.font_manager」の方でした。
理由としてはフォントの指定が難しいからです。
plt.rcParams[‘font.family’]の場合はシステム(or matplotlib?)に登録されているフォントしか基本的には使えません。
(基本的には、とは自分で登録すれば使えるのですが、それがまた面倒ということで)
ただシステム依存であるため、WindowsとMacでは使えるフォント、使えないフォントが違ってきます。
またシステム内には多数のフォント(100種類とかある場合も)があるため、どれが日本語が使えるか分からないということがありました。
そこでずっと避けていたのですが、日本語表示が可能か一覧で確認できるプログラムを発見したので、使ってみようかと思い立ったわけです。
ちなみにその方法はこちらの記事で紹介されています。
ということで一度日本語が使える、そしてそこそこの表示ができるフォントがあれば、方法その2「plt.rcParams[‘font.family’]」の方が楽なので、今後はこちらを使っていこうと思います。
ではでは今回はこんな感じで。
コメント