matplotlibで日本語を表示する【Python】

matplotlibでグラフを描く際にそのままでは日本語が文字化けしてしまいます。これはmatplotlibのデフォルトのフォントが日本語に対応していないだけで、それを日本語対応フォントに変更するだけで日本語を扱えるようになります。今回はその方法を説明していきます。

開発環境

  • matplotlib 3.3.4
  • Python 3.7.9

matplotlibにおける日本語の表示

matplotlibでなぜ日本語が表示できないのか?

matplotlibでグラフを描く際に日本語を入れようとすると文字化けしてしまいます。例えば以下のようにしてグラフを描くと、日本語部分がすべて▯▯▯で表示されてしまっていることが分かります。

import numpy as np
import matplotlib.pyplot as plt
  
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
  
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('X軸ラベルを日本語で設定')
ax.set_ylabel('Y軸ラベルを日本語で設定')
ax.set_title('タイトル')
ax.legend(['系列1'])
plt.show()

これはただ単にmatplotlibのデフォルトで設定されている文字のフォントが日本語に対応していたいためです。つまり、文字列を表示させるフォントを日本語に対応したフォントに変更させるだけで日本語の表示が可能になります。

日本語が表示可能なフォント

matplotlibで扱えるフォントの一覧は次のスクリプトから取得可能です。

import matplotlib.font_manager
print([f.name for f in matplotlib.font_manager.fontManager.ttflist])
['DejaVu Sans Display', 'DejaVu Sans', 'DejaVu Sans', 'STIXGeneral', 'DejaVu Serif', 'STIXGeneral', 'STIXSizeFiveSym', 'DejaVu Serif', 'DejaVu Sans Mono', 'cmb10', 'STIXNonUnicode', 'STIXSizeTwoSym', 'STIXSizeOneSym', 'cmss10', 'STIXNonUnicode', 'cmr10', 'STIXGeneral', 'STIXNonUnicode', 'STIXNonUnicode', 'STIXGeneral', 'DejaVu Sans Mono', 'DejaVu Serif', 'STIXSizeFourSym', 'STIXSizeTwoSym', 'DejaVu Serif', 'STIXSizeThreeSym', ...(中略)... , 'Times New Roman']

このうちWindows環境でよく使われる日本語表示が可能なフォントとしては次のようなものがあります。

  • MS Gothic、MS Mincho、Yu Gothic、Yu Mincho、Meiryo

日本語の表示方法

フォントの変更方法は次に説明するように毎回フォントを設定する方法と一括してフォントを変えてしまう方法があります。

日本語の表示方法①:テキストごとにfontfamilyを設定する

matplotlibにおける文字列はTextクラスのインスタンスとして生成されますが、そのフォントはfontfamilyプロパティに格納されています。set_xlabelメソッドやset_ylabelメソッド、set_titleメソッドなどで文字列を設定する際は、その引数にTextのプロパティを設定することでその文字列のフォントやサイズなどの詳細を指定できます。そこで、ここでは引数としてfontfamilyに日本語を表示できるフォントとして「Meiryo」を指定してみましょう。

なお、凡例を表示させるlegendメソッドにはfontfamilyを直接引数に取ることはできないので、プロパティを設定するprop引数に辞書形式でフォントを渡す必要があります。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3, 3, 0.1)
y = np.sin(x)
  
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('X軸ラベルを日本語で設定', fontfamily='Meiryo')
ax.set_ylabel('Y軸ラベルを日本語で設定', fontfamily='Meiryo')
ax.set_title('タイトル', fontfamily='Meiryo')
ax.legend(['系列1'], prop = {"family" : "Meiryo"})
plt.show()

日本語の表示方法②:一括でfontfamilyを設定する

テキストのフォントは先のどのように1つ1つ設定可能ですが、毎回設定するのは面倒であるのと、凡例のフォントのように他と設定方法が違うものがあったりと煩雑であるので、一括でフォントをしていしまう方法が便利です。matplotlibにおけるスクリプト内で共通の設定はrcParamsに辞書形式で格納されていて、そのフォントを表すキーは’font.family’です。スクリプトの冒頭に以下の一行を加えるだけで、そのスクリプトのフォントをすべて変更することができます。

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'フォント名'

それでは先ほどのスクリプトを書き直してみましょう。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Meiryo'

x = np.arange(-3, 3, 0.1)
y = np.sin(x)
  
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('X軸ラベルを日本語で設定')
ax.set_ylabel('Y軸ラベルを日本語で設定')
ax.set_title('タイトル')
ax.legend(['系列1'])
plt.show()

3行目でrcParams[‘font.family’]にフォント名を指定することで、スクリプト内のフォントをすべてMeiryoに書き換えています。


以上のように日本語に対応したフォントを指定するだけで日本語を表示できるようになります。基本的にはグラフ内のフォントは統一することが多いので、2番目の方法のrcParams[‘font.family’]で一括してしていしまい、フォントを変える必要のあるものだけ1番目の方法を組み合わせてフォントを指定するのがお勧めです。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)