【matplotlib】日本語の文字化けをFontPropertiesで解決

【matplotlib】日本語の文字化けをFontPropertiesで解決 プログラミング

matplotlibの日本語文字化けは、ごくごく普通に起こります。
そして、複数の解決方法が用意されています。

この記事では、FontPropertiesを使う方法を解説します。

本記事の内容

  • FontPropertiesとは?
  • FontPropertiesを使った日本語文字化けの解決
  • FontPropertiesを使ったフォントの使い分け

それでは、上記に沿って解説していきます。

FontPropertiesとは?

FontPropertiesは、クラスです。
matplotlib.font_managerモジュールに属するクラスになります。

matplotlib.font_managerには、以下の3つのクラスが存在します。

  • FontEntry
  • FontManager
  • FontProperties

このうち、次の2つのクラスが日本語の文字化け解決に利用できます。

  • FontManager
  • FontProperties

そして、今回はこのFontPropertiesの方を説明します。
FontPropertiesの使い方を覚えれば、次のようなグラフを作成できます。

グラフ自体は、簡単な棒グラフです。
matplotlibによる棒グラフの描画については、次の記事で解説しています。

見てほしいのは、テキストの部分です。
上のグラフでは、合計3つのフォントを利用しています。

したがって、FontPropertiesの使い方を覚えると次の効果を得られます。

  • matplotlibにおける日本語の文字化けの解決
  • matplotlibにおけるフォントの使い分け

日本語の文字化けを解消することに加えて、フォントの使い分けも習得できます。
これはもう、FontPropertiesを覚えるしかないでしょう。

覚えると言っても、簡単です。
一度理解できれば、細かいことは忘れても問題ありません。

そのため、気軽にFontPropertiesを覚えていってください。

以上、FontPropertiesについての説明でした。
次は、FontPropertiesを使った日本語文字化けを解決していきます。

FontPropertiesを使った日本語文字化けの解決

文字化けしているコードと文字化けしていないコードを比較します。
比較することで、FontPropertiesの使い方が明確になります。

日本語が文字化けしているグラフを描画するコード

上の文字化けしているグラフは、次のコードで作成しています。

import numpy as np
import matplotlib.pyplot as plt

labels = ['EUL', 'PES', 'EFA', 'EDD', 'ELDR', 'EPP', 'UEN', 'その他']
values = [39, 200, 42, 15, 67, 276, 27, 66]
lefts = np.arange(len(values))

plt.bar(lefts, values, width=0.5, color="#b2b2b2")
plt.xticks(lefts, labels)
plt.title("欧州議会選挙 2004")
plt.xlabel("政党")
plt.ylabel("議席数")

plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)

plt.savefig("test00.png")

日本語が文字化けしていないグラフを描画するコード

上の文字化けしていないグラフは、次のコードで作成しています。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

font_path = "font/ipaexg.ttf"
fp = FontProperties(fname=font_path)

labels = ['EUL', 'PES', 'EFA', 'EDD', 'ELDR', 'EPP', 'UEN', 'その他']
values = [39, 200, 42, 15, 67, 276, 27, 66]
lefts = np.arange(len(values))

plt.bar(lefts, values, width=0.5, color="#b2b2b2")
plt.xticks(lefts, labels, fontproperties=fp)
plt.title("欧州議会選挙 2004", fontproperties=fp)
plt.xlabel("政党", fontproperties=fp)
plt.ylabel("議席数", fontproperties=fp)

plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)

plt.savefig("test01.png")

比較した結果

ポイントとなるのは、次の3点です。

  • FontPropertiesの読み込み
  • FontPropertiesインスタンスの作成
  • fontpropertiesの設定

それぞれを下記で説明します。

FontPropertiesの読み込み

from matplotlib.font_manager import FontProperties

上記を追加しています。

FontPropertiesインスタンスの作成

font_path = "font/ipaexg.ttf"
fp = FontProperties(fname=font_path)

文字化けを解消することに限れば、上記の記述だけで十分です。
文字フォントの場所を「fname」に設定しています。

ipaexg.ttfに関しては、次の記事をご覧ください。

手元になければ、上記記事を参考にしてダウンロードしましょう。

fontpropertiesの設定

テキストを表示する関数の引数として、fontpropertiesを設定しています。

plt.xticks(lefts, labels, fontproperties=fp)
plt.title("欧州議会選挙 2004", fontproperties=fp)
plt.xlabel("政党", fontproperties=fp)
plt.ylabel("議席数", fontproperties=fp)

fontpropertiesに設定するのは、FontPropertiesインスタンスとなります。

以上、FontPropertiesを使った日本語文字化けの解決を説明しました。
次は、FontPropertiesを使ったフォントの使い分けを説明します。

FontPropertiesを使ったフォントの使い分け

フォントの使い分けは、先ほどの応用です。
応用というほど、難しいことではありませんけどね。

上のグラフは、次のコードで作成しています。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

font_path_1 = "font/ipaexg.ttf"
font_path_2 = "font/cinecaption226.ttf"
font_path_3 = "font/衡山毛筆フォント行書.ttf"

fp_1 = FontProperties(fname=font_path_1)
fp_2 = FontProperties(fname=font_path_2)
fp_3 = FontProperties(fname=font_path_3)

labels = ['EUL', 'PES', 'EFA', 'EDD', 'ELDR', 'EPP', 'UEN', 'その他']
values = [39, 200, 42, 15, 67, 276, 27, 66]
lefts = np.arange(len(values))

plt.bar(lefts, values, width=0.5, color="#b2b2b2")

plt.xticks(lefts, labels, fontproperties=fp_2)
plt.title("欧州議会選挙 2004", fontproperties=fp_3, size=15, color="blue")
plt.xlabel("政党", fontproperties=fp_1, color="green")
plt.ylabel("議席数", fontproperties=fp_1, color="green")

plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)

plt.savefig("test01.png")

見たらわかるレベルです。
ポイントとしては、フォント毎にインスタンスを用意していることになります。

テキストを表示する際に、そのインスタンスをfontpropertiesに設定してるだけです。
あとは、サイズやカラーを適当に追加しています。

何も難しいことは、ありません。
難しいとしたら、日本語フォントを集めてくることでしょう。

でも、無料でたくさんのフォントが公開されています。
それらを利用すれば、難しいことはなくなります。

ただし、フォントの拡張子には注意してください。
試した限りでは、OpenTypeフォントはダメでした。

以上、FontPropertiesを使ったフォントの使い分けについて説明しました。

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