matplotlibで日本語表示
題記の件、苦戦しましたので過程をメモしておきます。まずは下記をご覧ください。
import matplotlib.pyplot as plt plt.xlabel("あ") UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
上記はX軸に「あ」と表示させようとしただけなのですが、エラーが出ました。受け取ったものはasciiコードではないと怒られています。ちなみに、日本語でなければ以下のように動きます。
import matplotlib.pyplot as plt plt.xlabel("a")
原因調査
そこで以下のようなコマンドを打ってみました。
type("a") Out: str type("あ") Out: str
どちらも同じstr型なので、単純に日本語であることがダメなようです。そこでGoogle先生の力を借りて「Pyplot 日本語」等のキーワードで検索。以下を満足しなければダメなそうです。
- ユニコード形式で渡すこと。
- フォント形式を指定すること。
対策適用
まず、1から実施してみましょう。ユニコード形式で渡すためには文字列を囲む記号の前にuを付ければいいそうです。
import matplotlib.pyplot as plt plt.xlabel(u"あ")
エラーがでなくなりました。ただし、表示は□になっていて表示できていません。次に2を実施します。フォント形式を指定するためには以下の処理を加えればいいようです。ここでは仮に、MSゴシックのフォントを割り当てています。
import matplotlib.pyplot as plt import matplotlib.font_manager fp = matplotlib.font_manager.FontProperties(fname="C:\Windows\Fonts\msgothic.ttc") plt.xlabel(u"あ", fontproperties=fp)
これで日本語が表示できるようになりました。
参考
pandasのdataframe型のcolumnsを当てて読みだすときなど、str型の変数を渡したいときは、decodeすれば動きます。
import matplotlib.pyplot as plt import matplotlib.font_manager fp = matplotlib.font_manager.FontProperties(fname="C:\Windows\Fonts\msgothic.ttc") a = "あ" plt.xlabel(a.decode('utf_8'), fontproperties=fp)
これでようやくグラフが書けそうです。