Matplotlibの日本語の文字化けを直す方法【Python】

Matplotlibの日本語の文字化けを直す方法【Python】 プログラミング

Matplotlib日本語の文字化けを解消する方法を説明しています。

文字化けを解消するには、日本語のデジタルフォント(拡張子ttf)が必要です。
そのフォントを取得して、Matplotlibに認識させます。

これだけです。
ただ、所々にややこしいところもあります。
そのようなところも画像を利用して、理解できるように説明していきます。

追記 2021年7月2日
この記事内の方法が不可能、嫌いなどの場合は、別の方法もあります。
次の記事でその別の方法を解説しています。

本記事の内容

  • Matplotlibの文字化けを解消するための環境
  • Matplotlibのインストール場所を特定する
  • 日本語のデジタルフォントを取得する
  • Matplotlibに日本語のデジタルフォントを適用する
  • Matplotlibのフォント情報キャッシュを削除する
  • Matplotlibの文字化け解消を確認する

Matplotlibの文字化けを解消するための環境

今回の記事内で用いた環境は、次の通りです。
他のOSであっても、パスが異なる程度です。
その場合は、それぞれのOS用のパスに置き換えてみてください。

  • Windows 10 Home (バージョン1909)※以下の説明は64bit前提
  • Python 3.7.3
  • Matplotlib 3.2.1

追記 2020年12月16日
Ubuntuのケースを次の記事で解説しています。

Matplotlibのインストール場所を特定する

Matplotlibの設定ファイルを変更する必要があります。
また、Matplotlibが管理するフォルダに日本語のデジタルフォントの配置も必要です。

そのため、Matplotlibのインストール場所を特定しておかないといけません。
pipでインストールしていれば、どこにインストールしているかはわかりません。

そこで、次のPythonのプログラムを実行します。
これを実行すれば、Matplotlibの設定ファイルの場所がわかります。

import matplotlib
print(matplotlib.matplotlib_fname())

実行すると次のようなパスが表示されます。

C:\Python\Python37\site-packages\matplotlib\mpl-data\matplotlibrc

これは、Matplotlibの設定ファイルのパスです。
これにより、インストール場所が以下のパスだとわかります。

C:\Python\Python37\site-packages\matplotlib\

そうすれば、Matplotlibが管理している言語フォルダも判明します。
C:\Python\Python37\site-packages\matplotlib\mpl-data\fonts\ttf

パスをまとめましょう。

設定ファイル C:\Python\Python37\site-packages\matplotlib\mpl-data\matplotlibrc
言語フォルダ C:\Python\Python37\site-packages\matplotlib\mpl-data\fonts\ttf

各環境で「C:\Python\Python37」の部分は異なります。

日本語のデジタルフォントを取得する

IPA 独立行政法人情報処理推進機構のサイトへアクセスします。
ここでは、無償で日本語のデジタルフォントを配布しています。
https://ipafont.ipa.go.jp/node193#ja

追記 2021年1月23日
ダウンロードページが変更されたようです。
 
https://moji.or.jp/ipafont/ipaex00401/

IPA 独立行政法人情報処理推進機構

IPAexゴシック(Ver.004.01)をダウンロードします。
ipaexg00401.zip(4.0MB)リンクをクリック。

ダウンロードが完了したら、適当な場所に解凍します。
展開したフォルダの中には、以下のファイルが存在しています。

IPAexゴシック(Ver.004.01)

ここで重要なのは、ipaexg.ttfです。
このファイルをMatplotlibが言語を管理しているフォルダにコピーします。

Matplotlibに日本語のデジタルフォントを適用する

日本語のデジタルフォントをMatplotlibの言語フォルダへコピー

「日本語のデジタルフォントを取得する」で取得した、ipaexg.ttfをコピーします。
コピー先は、「Matplotlibのインストール場所を特定する」で判明した言語フォルダです。

Matplotlibのインストール場所を特定

コピーは完了です。

Matplotlibの設定ファイルに日本語のデジタルフォントを追加

「Matplotlibのインストール場所を特定する」で判明した、matplotlibrcです。
このファイルをエディターで開きます。

そして、「#font.」で検索します。
250行目前後がヒットします。

matplotlibrc

「#font.family : sans-serif」の上に「font.family : IPAexGothic」を追加します。
「#」は付けないください。

font.family  : IPAexGothic

追加したら、ファイルを上書き保存します。
これで、Matplotlibの設定ファイルへの追加が完了です。

Matplotlibのフォント情報キャッシュを削除する

念のため、フォント情報のキャッシュを削除しておきます。
キャッシュは便利ですけど、邪魔も頻繁にしてくれますからね。

キャッシュの場所は、次のパスとなります。
%userprofile%.matplotlib

C:\Users\【ユーザー名】.matplotlib

ここに移動すると以下のファイルが存在しています。

fontlist-v300.json・fontlist-v310.json

所詮は、キャッシュです。
fontlist-v300.json・fontlist-v310.jsonの両方を削除します。

環境によって、ファイル名が異なると思います。
でも、キャッシュなので、「*.json」というファイルはガンガンすべて削除しましょう。

fontlist-v300.jsonの内容です。
フォント名とフォントのパスが記載されています。

    {
      "fname": "fonts\\ttf\\STIXGeneral.ttf",
      "name": "STIXGeneral",
      "style": "normal",
      "variant": "normal",
      "weight": "regular",
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },
    {
      "fname": "fonts\\ttf\\DejaVuSerif.ttf",
      "name": "DejaVu Serif",
      "style": "normal",
      "variant": "normal",
      "weight": 400,
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },
    {
      "fname": "fonts\\ttf\\STIXSizTwoSymBol.ttf",
      "name": "STIXSizeTwoSym",
      "style": "normal",
      "variant": "normal",
      "weight": "bold",
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },

Matplotlibの文字化け解消を確認する

静止画(png)

実際のコードを動かします。

import matplotlib.pyplot as plt

plt.title("日本語タイトル")
plt.savefig('japanese.png')

実行結果は以下

Matplotlib静止画

日本語が化けずに表示されていますね。

アニメーションGIF

これもコードを動かして検証。
このコード検証するためには、MatplotlibでアニメーションGIFを作成できることが前提です。
詳細は次の記事を参考にしてください。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

graphs = []
fig = plt.figure()
x = np.arange(-30, 30, 0.2)
y = x ** 2
for i in range(30):
    plt.plot(x, y)
    g = plt.plot(i, i ** 2, 'o')
    graphs.append(g)
anim = animation.ArtistAnimation(fig, graphs, interval=30)
plt.title("アニメーションGIF")
plt.show()
anim.save('japanese.gif', writer='imagemagick')

実行結果は以下

アニメーションGIFでもOKですね。
ここまでOKなら、動画もOKのはずです。

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