【python】Matplotlibで日本語化して文字化けを無くす

Matplotlibはグラフ作成に便利だけど・・・

近年ますます需要が高まっているプログラミング言語であるpython、そんなpythonでのグラフ作成といえば、Matplotlibというライブラリを使うのが一般的です。

とまあこんな感じでMaplotlibはpythonでのデータ分析・グラフ作成・プロットに欠かせないライブラリな訳ですが、1つ大きな問題が存在します。

それは何かというと、日本語が文字化けするというものです。例えばpythonでplt.plot()で作ったグラフにラベルや凡例・グラフのタイトルなどに日本語を使用すると、□□□□□みたいな文字化けが起こってしまいます。

この原因はmatplotlibの既定のフォントがDejaVu Serifになっているからで、このフォントは日本語に対応していないので、日本語は豆腐で表示されてしまいます。

じゃあコンソール上で日本語対応のフォントに関数なりで再設定すればいいじゃないかという話になるわけですが、PCにデフォルトでインストールされている日本語のフォントの殆どがttcフォントファイルで、matplotlibはttcフォントファイルに対応していないんですよね。

例えば、Windowsで年賀状とかワードとか触ったら一度くらい目に触れているMSゴシック、MS明朝、メイリオ、游ゴシックはttcファイルです。なので、このままだとMatplotlibで使える日本語フォントはPCにインストールされていないので、Matplotlibで作ったグラフに日本語のラベル・凡例を表示させることはできません。

この問題の解決に自分も結構苦労しまして、データ分析が本題なのに、グラフに日本語を表示させるというしょーもない点で2度と時間を割きたくないので、対応方法を自分のメモ書きを兼ねて書きます。

なお、今回紹介するのはWindows、jupyter notebook環境下での設定方法です。ご留意ください。

実行環境

Windows10(64bit)

jupyter notebook

Matplotlibで使える日本語フォントをダウンロード・インストール

上述したようにMatplotlibで日本語が表示できないのはMatplotlibが読み込めるフォントの中に日本語のフォントがないからです。

というわけで、Matplotlibが読み込める日本語のフォントをダウンロードする必要があります。このNoto~はGoogleのフォントで世界各国の言語に対応しているフォントなので、まあ怪しいものではないです。

そしてダウンロードしたNoto Sans CJK JP、Noto Serif CJK JPを、解凍し中身を「コントロールパネル→デスクトップのカスタマイズ→フォント」の右側のエリアにドラッグ&ドロップしインストールします。

これでインストールが完了すれば、PC内部にttcファイルの日本語フォントがインストールされたことになるので、あとはMatplotlibの設定を少し変更します。

Matplotlibの設定ファイルを変更する

Matplotlibに先ほどインストールした日本語フォントを反映させる方法は以下の3つです。

①個別にフォントの設定をする

②スクリプトの最初でフォント変更の宣言をする

③設定ファイルmatplotlibrcを修正して既定のフォントを変更する

1番簡単なのは、①個別にフォントの設定をするなのでとりあえずそれでやると、コンソールを起動して以下の記述で、フォントを変更すれば完了です。

#Matplotlibのフォントを変更する
import matplotlib.pyplot as plt
from pylab import rcParams
import matplotlib as mpl

font = {"family":"Noto Sans CJK JP"}
mpl.rc('font', **font)

ただしここでnot found family~みたいなエラーがでてしまう人は、フォントの検索にキャッシュ使ってるおり、キャッシュを削除しないとインストールしたフォントをMatplotlibが認識していないので、キャッシュを削除する必要があります。

このキャッシュを削除しないと、設定ファイルを弄って場合でもMatplotlibには反映されません。キャッシュが入ってるディレクトリは大体~/.matplotlibですが、↓の操作でも確認できます。

#Matplotlibのキャッシュのディレクトリを確認する
import matplotlib
print(matplotlib.get_cachedir())

僕の場合は「C:\Users\ユーザー名\.matplotlib」にありました。ここにどんなファイルがあるかは環境次第なのですが、基本的にfontList.json(もしくはfontList.py3k.cache)を削除すれば設定完了です。

ちなみにMatplotlibで使用できるフォントは以下の関数で調べることができるので、これの実行結果にNoto sans~があったらインストールと設定は成功しており、先ほどの「font = {“family”:”Noto Sans CJK JP”} mpl.rc(‘font’, **font)」もエラーなく実行できるはずです。

#Matplotlibに使用できるフォントを確認する
import matplotlib.font_manager as fm
fonts = fm.findSystemFonts() 
print([[str(font), fm.FontProperties(fname=font).get_name()] for font in fonts[:10]])

これでMatplotlibでも日本語のラベルやタイトルや凡例が文字化けしなくなります。日本語の凡例を付ける機会は多いので、Matplotlibの日本語対応は是非やっておきたいですね。

ちなみにこの方法だと起動したときにいちいちフォントを宣言しないといけないのでそれがめんどくさいという人は「PythonユーザのためのJupyter[実践]入門」にデフォルトのフォントを変更する方法が書いてあったので、そちらを参照していただけると幸いです。

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする